以下代码将在内存耗尽之前将 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;
感谢大家的参与。你们是对的。我的代码实际上没有任何问题。
我通过关闭查询组件中的 CacheBlob 解决了内存耗尽问题。我正在使用 IBDAC,我所需要做的就是将该属性设置为 False。这使我能够在一台相当慢的 Windows 11 计算机上(在 IDE 中运行应用程序)上用一个多小时将 107,389 个文档复制到数据库中。看来我将数据放入缓存的速度比删除数据的速度还要快。
再次感谢您的所有评论。