TClientDataSet和内存限制

时间:2013-11-04 12:50:41

标签: delphi tclientdataset

我们有一个系统可以根据我们的数据创建报告。我们可以处理很多的数据。超过150,000行的想法并非不可能。

不幸的是,我们使用TClientDataSet的经验是它的局限性,因为当数据太大时,它通常会导致“此操作的内存不足”错误。

所以问题是:是否存在可以处理大量数据的TDataSet通常可用的实现(例如直接流式传输到文件而不是将整个数据集保存在内存中)?

我愿意自己实施这样的课程。但据我所知TClientDataSet,它需要能够在将数据保存到文件/流之前包含数据。此外,再次加载数据也应该可以作为流而不是加载到整个TClientDataSet对象中,因为那样我们就不会解决问题了。

4 个答案:

答案 0 :(得分:4)

您可以在embedded mode中使用FireBird或Interbase。

答案 1 :(得分:1)

在报告之前是否真的需要缓存客户端上的所有数据?如果没有,可能会重新考虑如何查询和处理数据以生成这些报告,并查看是否存在涉及较少客户端数据的方式(通过网络传输的数据较少)。

如果您之前已经走过这条路并且您确实需要所有这些数据客户端,那么您可以查看自定义数据结构。 TList<T>个记录(即使您需要构建自己的索引)占用的内存比TClientDataSet少得多。

答案 2 :(得分:0)

KBMMemTable是TClientDataset

的不错替代品

http://www.components4programmers.com/products/kbmmemtable/

我们正在使用它多年,它非常有用和快速。

答案 3 :(得分:0)

想要强调TClientDataset的容量可能会更大。

测试TClientDataset的限制 - 附加xxx,xxx记录,将单个记录整个(重复)以创建大小的想法。

//开始将记录加载到TCLientDataset以进行反向(反向)处理

dxMemData1.Append;

dxMemData1 ['NT_Rec_No']:= 1000;

dxMemData1 ['NT_User']:='DEV \ Administrator';

dxMemData1 ['NT_Type']:='信息';

dxMemData1 ['Ora_Timestamp']:='20170706033859.000';

dxMemData1 ['Ora_Host']:='DEV0001';

dxMemData1 ['Ora_SID']:='Oracle.orcl';

dxMemData1 ['Ora_Event_Id']:='34';

dxMemData1 ['NT_Message']:= Memo1.Text;

dxMemData1.Post;

//结束加载记录到TCLientDataset以进行反向(反向)处理

memo1上的字符串是100个字符 - ansi

进行了多次测试,并设法保持600,000到900,000条记录,而不会崩溃。

可以通过使备忘录上的文字更大来实现差异 - 这确实减少了崩溃前的最大数量 - 这意味着它不是精确最大值的问题。记录号 - 但是消耗的大小 - 我的猜测。

使用TdxMemData(devexpress)测试相同,这次我几乎可以达到记录的两倍