我使用TIBDataSet
来使用Delphi 2007从Firebird数据库表中获取记录。该表中有大约100万条记录,并且我得到了Out of memory
错误。但是,TClientDataset
正确的查询运行正常。TDataSet和TClientDataset内存管理有什么区别?
请问关于内存管理的TClientDataset
和TDataSet
之间的区别?
我使用TIBDataSet
来使用Delphi 2007从Firebird数据库表中获取记录。该表中有大约100万条记录,并且我得到了Out of memory
错误。但是,TClientDataset
正确的查询运行正常。TDataSet和TClientDataset内存管理有什么区别?
请问关于内存管理的TClientDataset
和TDataSet
之间的区别?
@alzaimar有一点,在32位平台上加载到内存中的数百万条记录会成为一个挑战,无论您使用哪个数据集组件。
因此,盒子上的记忆是至关重要的。
我们用Delphi 2006编写的应用程序做类似的事情。我们所做的是在Windows7 64位或服务器2008 64位上运行它们。
利用OS和其他应用程序的额外内存。
尝试The best memory manager for Delphi
也把{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}在尤尔项目获得高达4GB出32位德尔福的在64位框的源代码。
program Project15;
uses
Forms,
Unit15 in 'Unit15.pas' {Form15};
{$R *.res}
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
begin
Application.Initialize;
Application.CreateForm(TForm15, Form15);
Application.Run;
end.
做上述将让你看到这是最适合你的应用TDataSet的或TClientDatset。
您也可以考虑使用一些第三方数据连接组件,这些组件对基本的Delphi数据对象具有改进的性能和内存管理。
我们使用Devart组件和SQL工具,他们确实值钱。 Devart Data tools website
人们的注意事项谁在这里回答:请检查问题的标题,并请不要告诉人们如何编码!在使用Google搜索时,我对无聊的问题感到无聊。 这是一个完美的例子!谷歌将向这里的数百万人发送真正想知道这两种数据集之间差异的信息。但是他们看到人们在说“你为什么要这么做?”。我会在下面发表真实的答案。 – Simon
我不知道它们之间究竟有什么区别,但是IIRC在TIBDataset中的内存不足问题可以通过将'Unidirectional'属性设置为true来解决。请注意,这会改变数据集的行为方式,因此可能不适合您的情况。 –
通常,当我读到有人读取1个Mio记录时,他的设计通常是错误的。通常有更好的方法来解决你的问题。 – alzaimar
我明白了@alzaimar的评论另一方面:阅读百万条记录不应该使数据访问层崩溃。 –