超过10w个 array of record

iamduo 2010-03-16 09:48:14
我建立了一个动态 record 数组
TMyRecord = record
FieldNames:array of string;
Records:array of array of Variant;
end;

大致的结构如上,目的是把数据库里的东西保存进来,做一些特殊的运算。
用一个类来管理。它作为类的一个private 存在。

现碰到一个问题。如果我插入10万条记录的话,就会报 out of memory 。

请问怎么解决?
或者说,谁知道 CreateMemoryView 对动态record数组的应用?
...全文
180 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQLDebug_Fan 2010-03-17
  • 打赏
  • 举报
回复
Win 32下应用程序能够使用最大的内存大小是2G,看一下你在加载数据的时候,程序的Virtual Size是否超过2G了,如果超过2G就会报Out Of Memory,也有可能你申请的一块内存太大,系统没有这么大的,也会报错。查看内存状态的软件ProceXP非常好用,推荐用一下。用内存映射可以解决这个问题,如果实现内存映射加分页,那么程序效率会更高,尤其是硬盘的碎片非常多的时候。
iamduo 2010-03-16
  • 打赏
  • 举报
回复
我之前写了一个1.0版本的,将我的分析,由00:21:25->00:19:30
提升的不是很多。
不过我们可以看出,再优化的TDataSet查找方法,也比不过直接使用动态数组。
想着吧,把后面那个秒数也去掉。
所以在写2.0版本。理论上验证,是可以达到我想的结果。
就是在过大数据量10w条的时候,(当然,业务上还不会有这么大的数据。仅仅个人的思考点)。
iamduo 2010-03-16
  • 打赏
  • 举报
回复
呵呵,解释一下。

由于一些特殊的需求,我在写一个关于数据管理的东西。
也就是从数据库中取得内容,保存成一个文件。然后,透过该文件,查询得到相关的数据。
用数据库本身,或者dbGO控件效率上很糟糕。
所以我想到的是用二分法去search 一个动态Record,封装了一个简单的类似于TDataSet的东西。
昨天完成了读写部分,做了一个小实验,一下子插入10000条数据(5个字段)耗时10几秒,但是新增10w条的时候,out of memory。
我能想到的解决方案是 内存映射。

就是尚在研究 内存映射 和 动态Record 的应用。
我晓得,我的结构对于 内存映射 是很痛苦的一件事情。
因为 string ,variant。

但是,我自己这个类已经实现了 LoadFromStream LoadFromFile (利用 TWriter TReader)
所以,估计还是有机会实现的。
IDWB 2010-03-16
  • 打赏
  • 举报
回复
10万条记录。。。。
既然是从数据库中取出来的,是否可以考虑直接用clone 到 _recordset
无条件为你 2010-03-16
  • 打赏
  • 举报
回复
你10万条记录插在哪?
Harryfin 2010-03-16
  • 打赏
  • 举报
回复
可不可以考虑做成分批呢?
foodztf 2010-03-16
  • 打赏
  • 举报
回复
那分吧
regersubadm 2010-03-16
  • 打赏
  • 举报
回复
这样的话是在栈上分配的空间吧,像需要这么大的内存尽量要在堆上分配才行的。
yshuui 2010-03-16
  • 打赏
  • 举报
回复
直接用ADO控件的LoadFromFile()
SaveToFile()方法试试速度,这个应该是在内存操作的。
不知道能不能用SQL。
SQLDebug_Fan 2010-03-16
  • 打赏
  • 举报
回复
查看一下程序的虚拟内存大小,如果超过2G了,就会Out Of Memory
ok1411 2010-03-16
  • 打赏
  • 举报
回复
FieldNames:array of string;
这里的string给个长度限制看看 ,如string[64]
gxj760998 2010-03-16
  • 打赏
  • 举报
回复
修改默认的内存 堆栈占用空间,但这不是个好办法。
除非能估计出你最大的内存使用限制。
建议采用分批方式。
ahjoe 2010-03-16
  • 打赏
  • 举报
回复
我想,你不需要把全部数据都保存到内存里。应该只保存你搜索需要用到的信息和记录号(或关键字段)
tylzyoudi 2010-03-16
  • 打赏
  • 举报
回复
你申请的内存空间太多!
无条件为你 2010-03-16
  • 打赏
  • 举报
回复
RAR打包很大的文件都不会出错,如果是将数据库中的记录按照某格式(定义一个结构体)以流方式分批写入一个文件,我或者可以帮到你。

另外有一点特别要注意:二维动态数组的存储空间并不像一组数组那样是连续的。
还有:Variant如果不是必要的,尽量不要用,因为它势必导致系统开销过高。你到网上搜下Variant类型就知道了。定义二组Variant动态数组非常不明智。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧