我建立了一个动态 record 数组
 TMyRecord = record
    FieldNames:array of string;
    Records:array of array of Variant;
 end;大致的结构如上,目的是把数据库里的东西保存进来,做一些特殊的运算。
用一个类来管理。它作为类的一个private 存在。现碰到一个问题。如果我插入10万条记录的话,就会报 out of memory 。请问怎么解决?
或者说,谁知道 CreateMemoryView 对动态record数组的应用?

解决方案 »

  1.   

    查看一下程序的虚拟内存大小,如果超过2G了,就会Out Of Memory
      

  2.   

    10万条记录。
    既然是从数据库中取出来的,是否可以考虑直接用clone 到 _recordset
      

  3.   

    呵呵,解释一下。由于一些特殊的需求,我在写一个关于数据管理的东西。
    也就是从数据库中取得内容,保存成一个文件。然后,透过该文件,查询得到相关的数据。
    用数据库本身,或者dbGO控件效率上很糟糕。
    所以我想到的是用二分法去search 一个动态Record,封装了一个简单的类似于TDataSet的东西。
    昨天完成了读写部分,做了一个小实验,一下子插入10000条数据(5个字段)耗时10几秒,但是新增10w条的时候,out of memory。
    我能想到的解决方案是 内存映射。就是尚在研究 内存映射 和 动态Record 的应用。
    我晓得,我的结构对于 内存映射 是很痛苦的一件事情。
    因为 string ,variant。但是,我自己这个类已经实现了 LoadFromStream LoadFromFile  (利用 TWriter TReader)
    所以,估计还是有机会实现的。
      

  4.   

    我之前写了一个1.0版本的,将我的分析,由00:21:25->00:19:30
    提升的不是很多。
    不过我们可以看出,再优化的TDataSet查找方法,也比不过直接使用动态数组。
    想着吧,把后面那个秒数也去掉。
    所以在写2.0版本。理论上验证,是可以达到我想的结果。
    就是在过大数据量10w条的时候,(当然,业务上还不会有这么大的数据。仅仅个人的思考点)。
      

  5.   

    RAR打包很大的文件都不会出错,如果是将数据库中的记录按照某格式(定义一个结构体)以流方式分批写入一个文件,我或者可以帮到你。另外有一点特别要注意:二维动态数组的存储空间并不像一组数组那样是连续的。
    还有:Variant如果不是必要的,尽量不要用,因为它势必导致系统开销过高。你到网上搜下Variant类型就知道了。定义二组Variant动态数组非常不明智。
      

  6.   

    FieldNames:array of string;
    这里的string给个长度限制看看 ,如string[64]
      

  7.   

    直接用ADO控件的LoadFromFile()
    SaveToFile()方法试试速度,这个应该是在内存操作的。
    不知道能不能用SQL。
      

  8.   

    Win 32下应用程序能够使用最大的内存大小是2G,看一下你在加载数据的时候,程序的Virtual Size是否超过2G了,如果超过2G就会报Out Of Memory,也有可能你申请的一块内存太大,系统没有这么大的,也会报错。查看内存状态的软件ProceXP非常好用,推荐用一下。用内存映射可以解决这个问题,如果实现内存映射加分页,那么程序效率会更高,尤其是硬盘的碎片非常多的时候。