terrytr 发表于 2014-6-15 19:50:23

请教大家allocate开不了大数组的原因

本帖最后由 terrytr 于 2014-6-19 12:24 编辑

各位下午好。这两天在使用国外大神发出的代码时,发现一个问题。先说一句,这个程序是公开的,应该不会是代码本身的问题。这个程序是读取外部txt文件,根据读入参数个数来动态给定数组的大。在以前的使用过程中,由于参数个数不多,程序没有任何问题。但这两天在读入参数较多时,就出现数组开不了的情况,即,语句allocate(a(),b(),..stat=num),这里的单精度浮点数数组a,b,..有很多,一维,二维的都有。当数组开得过大时,就出现了后面的num不为0.(为0才是分布了内存)。比如,卡在abc(14112,14112)这个数组,报错。这个浮点数数组大小在756MB吧。电脑32位win8.1,内存2G,VS2008+IVF-IA32。不知道说清楚没有,大家给出出主意吧。很急!
==================================
刚刚换平台了。这回是8G内存,但是VS2010和IVF2011都是32位的。也出现上述错误。原因在于要开至少6个756MB的数组。请问大家,除了换64位的VS2010外,还有其他解决办法么?
我实在是想不到了。如果还不信,准备到Linux平台试下。
==================================
最近小弟尝试了两种方式:
(1)由于VS2010没有64位版本,安装了32位的VS2010和可支持32位和64位的IVF编译器。在编译的时候,选择IVF编译器平台为X64。这样,比之前仅仅停留在数据读入后,分配内存时挂掉稍好点。这次是数据读入、分配内存,没问题。但是在后面开数组运算时,还是出现了无法动态分配内存而失败的情况。
(2)在linux平台下,采用gfortran编译器,出现的问题和之前一样,在数据读入后,分配内存即出错。
上述两种情况都是电脑内存只用了2G 左右(任务管理器显示),但是有几次运行时,电脑报出了黄色感叹号--内存不足。不知道为什么。此为问题1.
问题2:在linux平台下,用C++语言时,可以开数组直到内存耗空,但是Fortran为什么开不了?小弟诚心请教大家。谢谢了!

安靖 发表于 2014-6-15 20:06:25

本帖最后由 安靖 于 2014-6-15 20:12 编辑

试试增加编译选项-heap-arrays

heap-arrays是为了把内存申请从栈上移到堆上


mangix2010 发表于 2014-6-15 22:32:52

应该是超过限制了,特别是大数组的时候

fcode 发表于 2014-6-15 22:36:13

是啊。32位系统2GB内存,加上操作系统预留的,运行时库的,还有其他数组,应该是超了。

要么减少数组,要么优化算法,要么使用64位吧

terrytr 发表于 2014-6-16 09:37:23

安靖 发表于 2014-6-15 20:06
试试增加编译选项-heap-arrays

heap-arrays是为了把内存申请从栈上移到堆上


昨晚上试过了,很遗憾,还是上面说的结果。谢谢了。

安靖 发表于 2014-6-16 21:46:22

好像vs2010只有32版本的,但是可以编译64位的程序。你可以运行程序的时候,看下资源管理器里内存的使用情况。
照你说的至少开6个756MB的数组,这里就4G以上了,加上系统使用的内存,还有你可能漏算的开数组的内存,也有可能8G不够的。
确定是机器内存不够的话,那就可以换大机器了

山大克鲁士 发表于 2014-6-17 09:51:45

本帖最后由 山大克鲁士 于 2014-6-17 09:55 编辑

要么用64-bit,要么在32-bit下用多进程.
32-bit单进程啥都不改的情况下,real(8), allocatable :: a, allocate (a(15751, 15751))已经是极限了。。。

珊瑚虫 发表于 2014-6-17 19:45:27

使用64位平台编译

terrytr 发表于 2014-6-19 12:24:51

珊瑚虫 发表于 2014-6-17 19:45
使用64位平台编译

仍然不行。请帮忙看下问题更新。谢谢。

terrytr 发表于 2014-6-19 12:25:13

山大克鲁士 发表于 2014-6-17 09:51
要么用64-bit,要么在32-bit下用多进程.
32-bit单进程啥都不改的情况下,real(8), allocatable :: a, alloc ...

仍然不行。请帮忙看下问题更新。谢谢。
页: [1] 2
查看完整版本: 请教大家allocate开不了大数组的原因