我们有一个系统可以根据我们的数据创建报告。我们可以处理很多的数据。超过150,000行的想法并非不可能。
不幸的是,我们使用TClientDataSet
的经验是它的局限性,因为当数据太大时,它通常会导致“此操作的内存不足”错误。
所以问题是:是否存在可以处理大量数据的TDataSet
通常可用的实现(例如直接流式传输到文件而不是将整个数据集保存在内存中)?
我愿意自己实施这样的课程。但据我所知TClientDataSet
,它需要能够在将数据保存到文件/流之前包含数据。此外,再次加载数据也应该可以作为流而不是加载到整个TClientDataSet
对象中,因为那样我们就不会解决问题了。
答案 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)测试相同,这次我几乎可以达到记录的两倍