English 中文(简体)
记忆错误中,将600MB文档插入作为档案数据显示的ql服务器
原标题:Out of memory error as inserting a 600MB files into sql server express as filestream data

(请读下文更新部分,我把原来的问题留待澄清)

我正在将许多档案插入一个储存库,供存档。

我在档案中插入一个文件夹到一个数据库表。

在我试图插入600份甲基溴档案之前,一切都会受到罚款。

添加后,任务主管机构使用+600MB记忆,我有错误。

亚洲开发银行的规模和带; 1 GB和文件的总尺寸为8 GB,我使用Serk Express R2,根据文件,我只有在试图用10 GB(Express limit)——现行行规模的文件时才会有问题。

谁能告诉我为什么我有这个错误? 这对我来说非常重要。

www.un.org/Depts/DGACM/index_spanish.htm 简称:

我提出150个,因为它对我来说非常重要!

这似乎限制了Delphi记忆管理员,试图添加一个大于500德国马克的文件,我检查了500至600德国元之间的确切门槛。 我使用SDAC的构成部分,特别是一个TMSQuery(但我认为,可以与Dataset的后代做同样的工作),把该文件列入一个有PK(ID_DOC_FILE)和一个var(max)领域(DOCUMENT)的表格。 我确实:

procedure UploadBigFile;
var 
  sFilePath: String; 
begin 
  sFilePath :=  D:TestVeryBigFile.dat ; 
  sqlInsertDoc.ParamByName( ID_DOC_FILE ).AsInteger := 1; 
  sqlInsertDoc.ParamByName( DOCUMENT ).LoadFromFile(sFilePath, ftblob); 
  sqlInsertDoc.Execute; 
  sqlInsertDoc.Close; 
end;

发展援助委员会小组告诉我,这限制了德尔菲记忆管理员。 如今,由于发援会没有支持档案,我无法做第一次回答中C#中的建议。 唯一的解决办法是向恩巴士罗报告,要求一个 b点?

www.un.org/Depts/DGACM/index_spanish.htm

确实,感谢所有回答我的人。 为保证添加大博龙,对快车版来说可能是一个问题(由于1 GB of ram的局限性),在企业版上,我有错误,这是“德尔菲”的错误,而不是一种q服务器。 因此,我认为,我接受的答案确实触及了这一问题,即使我现在没有时间核实这个问题。

最佳回答

发展援助委员会小组告诉我,这限制了德尔菲记忆管理员。

对我来说,我喜欢简单的答复,我对此进行了调查。 我没有SDAC部件,我也没有使用LQ服务器,我的好客是消防鸟和SQIBX组成部分。 我尝试利用IBX把600Mbblob插入一张桌子,然后利用ADO(涵盖两个连接技术,两个是TDataSet后裔)。 我发现,真相是中间的某个地方,它实际上不是记忆管理员,它不是发展援助委员会的过错(well...)。 如果有更多的人试图将600兆布博龙带入数据库,但他们能够做一些事情,但这与本次讨论无关。 “问题”与亚洲开发银行在德尔菲的法典相同。 由于Delphi公司坚持使用单一变数来掌握任何类型的数据,因而可能装入参数。 这样做是明智的,毕竟我们可以把不同东西的批量装入一个INSERT的参数。 第二个问题是,Delphi希望将这种变式作为评估西非的类型处理: 它两次在名单上复制,可能三次。 当参数从档案中装载时,第一份复印件就正确。 第二份复印件是在准备将参数发送到数据库发动机时进行的。

撰写这本书容易:

var V1, V2:Variant;
V1 := V2;

并且只为Integer和日期及小强者做罚款,但当V2是600个Mb变式阵列时,转让显然能够提供完整副本! 现在考虑的是可用于32个轨道应用的记忆空间,这种应用不以“3G”方式运行。 只有 2 Gb是空间。 其中一些空间是保留的,其中一些空间是用于可执行本身,然后是图书馆,然后为记忆管理人保留一些空间。 在提供头600兆布分配之后,仅仅没有足够的空间分配其他600兆布缓冲! 由于这一点,它可以安全地把它归咎于记忆管理人员,但又是这样,为什么银完全需要600个 M子的复印件?

One possible fix

将档案分解成更小、更可管理的小丘。 建立数据库表,有3个领域: ID_DOCUMENT, SE RequestNCE, DOCUMENT. 此外,表上的主要要点是(ID_DOCUMENT, SE RequestNCE)。 下面尝试:

procedure UploadBigFile(id_doc:Integer; sFilePath: String);
var FS:TFileStream;
    MS:TMemoryStream;
    AvailableSize, ReadNow:Int64;
    Sequence:Integer;
const MaxPerSequence = 10 * 1024 * 1024; // 10 Mb
begin

  FS := TFileStream.Create(sFilePath, fmOpenRead);
  try
    AvailableSize := FS.Size;
    Sequence := 0;
    while AvailableSize > 0 do
    begin
      if AvailableSize > MaxPerSequence then
        begin
          ReadNow := MaxPerSequence;
          Dec(AvailableSize, MaxPerSequence);
        end
      else
        begin
          ReadNow := AvailableSize;
          AvailableSize := 0;
        end;
      Inc(Sequence); // Prep sequence; First sequence into DB will be "1"
      MS := TMemoryStream.Create;
      try
        MS.CopyFrom(FS, ReadNow);

        sqlInsertDoc.ParamByName( ID_DOC_FILE ).AsInteger := id_doc; 
        sqlInsertDoc.ParamByName( SEQUENCE ).AsInteger := sequence; 
        sqlInsertDoc.ParamByName( DOCUMENT ).LoadFromStream(MS, ftblob); 
        sqlInsertDoc.Execute; 

      finally MS.Free;
      end;
    end;
  finally FS.Free;
  end;

  sqlInsertDoc.Close;       

end;
问题回答

你可以在你储存全部物体之前,通过你试图插入的物体的逐行流,并基本上将其中一部分放在你的数据库中。

我想谈谈布图。 如果你重新使用,则采用Copy()方法。 NET

在我头顶端,用什么方法把你的档案整理成像:

        var file = new FileStream(@"c:file.exe");
        byte[] fileStream;
        byte[] buffer = new byte[100];
        file.Write(fileStream, 0, fileStream.Length);
        for (int i = 0; i < fileStream.Length; i += 100)
        {
            Buffer.BlockCopy(fileStream, i, buffer, 0, 100);
            // Do database processing
        }

这里的一个例子是,磁盘存档,将其保存到国际自由工会联合会的一栏。 (假设你已经具备交易背景,并用“档案馆”和“txContext”变量存档。)

 Open the FILESTREAM data file for writing
Dim fs As New SqlFileStream(filePath, txContext, FileAccess.Write)

 Open the source file for reading
Dim localFile As New FileStream("C:	empmicrosoftmouse.jpg",
                                FileMode.Open,
                                FileAccess.Read)

 Start transferring data from the source file to FILESTREAM data file
Dim bw As New BinaryWriter(fs)
Const bufferSize As Integer = 4096
Dim buffer As Byte() = New Byte(bufferSize) {}
Dim bytes As Integer = localFile.Read(buffer, 0, bufferSize)

While bytes > 0
    bw.Write(buffer, 0, bytes)
    bw.Flush()
    bytes = localFile.Read(buffer, 0, bufferSize)
End While

 Close the files
bw.Close()
localFile.Close()
fs.Close()

你也许会发现一些地方的破碎问题。 在记忆中,特别是在可能需要重新定位的任何情况下,用真正的庞大的记忆块进行活动,往往造成记忆错误,因为在理论上,你有足够的记忆来做这项工作。 如果它需要600平方米的区块,那么它就能够发现一个600mb宽的洞,从记忆中消失。

虽然我从未试图尝试过,但我倾向于工作,即制定一个极小的方案,即:ONLY>/em>一个行动。 尽可能少保留记忆分配。 面对像这种风险行动时,外部方案要做这项工作。 该方案运行、操作和退出。 这一点是,新方案有自己的地址。

唯一真正的解决办法是64条轨道,我们还没有这种选择。

我最近遇到过类似的问题,同时在非常大的桌子上管理着亚洲开发银行的CHECKDB。 我会发现这一错误:

There is insufficient system memory in resource pool internal to run this query.

这是在2008年服务器R2快车上。 有趣的是,我可以通过在表格中增加或删除一定数目的行文来控制错误的发生。

在与各种服务器专家进行广泛研究和讨论之后,我得出结论,该问题是:memory pressure <

给我的建议是:

  1. Acquire a machine with more memory and a licensed edition of SQL Server or...
  2. Partition the table into sizeable chunks that DBCC CHECKDB could handle

由于将这些档案贴入国际不动产业联合会的物体的复杂性,我建议file。 这种方法,简单地利用服务器储存档案的位置。

“虽然所支助的数据库或用户数目没有限制,但仅限于使用一台处理器、1台GB记忆和4个GB数据库文档(10个GB数据库档案,取自Sk Express 2008R2)。 不是数据库档案的规模,而是“1 GB记忆”。 Try挤压了600MB+文档,但将其放入溪流。





相关问题
determining the character set to use

my delphi 2009 app has a basic translation system that uses GNUGetText. i had used some win API calls to prepare the fonts. i thought it was working correctly until recently when someone from Malta ...

Help with strange Delphi 5 IDE problems

Ok, I m going nuts here. For the last (almost) four years, I ve been putting up with some extremely bad behavior from my Delphi 5 IDE. Problems include: Seemingly random errors in coride50.bpl ...

How to write a Remote DataModule to run on a linux server?

i would like to know if there are any solution to do this. Does anyone? The big picture: I want to access data over the web, using my delphi thin clients. But i´would like to keep my server/service ...

How convert string to integer in Oxygene

In Delphi, there is a function StrToInt() that converts a string to an integer value; there is also IntToStr(), which does the reverse. These functions doesn t appear to be part of Oxygene, and I can ...

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...