读书人

超过10w个 array of record,该怎么处理

发布时间: 2012-03-16 16:34:56 作者: rapoo

超过10w个 array of record
我建立了一个动态 record 数组
TMyRecord = record
FieldNames:array of string;
Records:array of array of Variant;
end;

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

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

请问怎么解决?
或者说,谁知道 CreateMemoryView 对动态record数组的应用?

[解决办法]
查看一下程序的虚拟内存大小,如果超过2G了,就会Out Of Memory
[解决办法]
这样的话是在栈上分配的空间吧,像需要这么大的内存尽量要在堆上分配才行的。
[解决办法]
可不可以考虑做成分批呢?
[解决办法]
你10万条记录插在哪?
[解决办法]
10万条记录。。。。
既然是从数据库中取出来的,是否可以考虑直接用clone 到 _recordset
[解决办法]
RAR打包很大的文件都不会出错,如果是将数据库中的记录按照某格式(定义一个结构体)以流方式分批写入一个文件,我或者可以帮到你。

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

[解决办法]
我想,你不需要把全部数据都保存到内存里。应该只保存你搜索需要用到的信息和记录号(或关键字段)
[解决办法]
修改默认的内存 堆栈占用空间,但这不是个好办法。
除非能估计出你最大的内存使用限制。
建议采用分批方式。
[解决办法]
FieldNames:array of string;
这里的string给个长度限制看看 ,如string[64]
[解决办法]
直接用ADO控件的LoadFromFile()
SaveToFile()方法试试速度,这个应该是在内存操作的。
不知道能不能用SQL。
[解决办法]
那分吧
[解决办法]
Win 32下应用程序能够使用最大的内存大小是2G,看一下你在加载数据的时候,程序的Virtual Size是否超过2G了,如果超过2G就会报Out Of Memory,也有可能你申请的一块内存太大,系统没有这么大的,也会报错。查看内存状态的软件ProceXP非常好用,推荐用一下。用内存映射可以解决这个问题,如果实现内存映射加分页,那么程序效率会更高,尤其是硬盘的碎片非常多的时候。

读书人网 >.NET

热点推荐