edwalik:由于是行业化的软件输出的网格数据,其二进制文件结构没有具体的结构说明,只有用ASCII文本来解读, 输出的文本数据量太大, 300*300*100的网格文本输出来可能有300M的文本文件,文本文件的结构是有, 但是每一次读写相应的数据区块都要遍历查找关键字,效率太低,所以需要一次录入内存。
请问怎么样可以申请1.7G的堆呢,char a[1700000000]这样的直接申请是不行吧,系统分配不了这么大的内存吧, 我用的是[图片]这样或者[图片]
有个一问,为什么上面第一个图里的代码运行后程序的内存占用能到1~2个G,而第二个图里的代码运行后程序的内存只占用15M左右呢

edwalik,您好!
1、 第一个图代码采取的是C语言显式申请内存方式,一般用户态下的程序一次性申请内存是有限的,操作
系统会对此有限制。若用户申请超出操作系统设定上限,一般程序会终止运行。
而第二个图使用的是QT容器,如果您看过QT的实现代码,其实它是在每个容器中的末端预留一定字节
用于扩展和链接用(内容实际是保留链接用的指针),以便QT可以快速插入、删除等使用;
2、 不知您使用的petrel是2009版还是2012版,对于地质类建模、运算这样的较大数据,我们一般建议
数据处理使用UNIX(LINUX),而处理完数据后再导入Win的petrel。当然如果您能有条件使用国家的超算计算机则另当别论。
因为UNIX(LINUX)本身设计就为了大规模运算设计,允许一般用户申请远超真实内存的内存需求,系统会自动将
硬盘(外存)作为内存使用,而且运行十分稳定。
试想下,以前内存才256K,512K时,又如何能运行得了那些大型数据库呢?
3、 对于文本方式做处理或交换时,要设计好索引的主KEY和辅KEY,采用哈希等方式是可以快速索引和运算的。
40多G的文本文件在2G内存的UNIX普通PC机一次性处理是没有任何压力的。这点请您放心。
祝好运!
begboy