使用 Delphi 将文档添加到 Firebird BLOB 字段时内存不足

问题描述 投票:0回答:1

以下代码将在内存耗尽之前将 3000 到 4000 个不同大小的文档添加到 Firebird Blob 字段中。我相信我已经释放了我创建的流,但我可能做得不正确。 Streams 是我工具箱中的一个新工具。有人能发现我做错了什么吗?

procedure TfrmMigration.Button1Click(Sender: TObject);
var
  DocFile: string;
  Blob: TStream;
  fs: TFileStream;
begin
  with DM.qImageList do
  begin
    close;
    SQL.Text := ImgListSQL;
    open;
    First;

    while not eof do
    begin
      { Ignore if previously done.}
      if (FieldByName('Document_Files').IsNull) then
      begin
        DocFile := Trim(gsDocumentPath + '\' + FieldByName('ImageName').asString);
        if FileExists(DocFile) then
        begin
          edit;
          Blob := CreateBlobStream(FieldByName('Document_Files'), bmWrite);
          try
            Blob.Seek(0, soFromBeginning);
            fs := TFileStream.Create(DocFile, fmOpenRead or fmShareDenyWrite);
            try
              Blob.CopyFrom(fs, fs.Size);
            finally
              fs.free;
            end;
          finally
            Blob.free;
          end;
          post;
        end;
      end;
      next;
    end;
  end;
end;
delphi blob streaming firebird
1个回答
0
投票

感谢大家的参与。你们是对的。我的代码实际上没有任何问题。

我通过关闭查询组件中的 CacheBlob 解决了内存耗尽问题。我正在使用 IBDAC,我所需要做的就是将该属性设置为 False。这使我能够在一台相当慢的 Windows 11 计算机上(在 IDE 中运行应用程序)上用一个多小时将 107,389 个文档复制到数据库中。看来我将数据放入缓存的速度比删除数据的速度还要快。

再次感谢您的所有评论。

© www.soinside.com 2019 - 2024. All rights reserved.