Fortran Coder

标题: 请教大家allocate开不了大数组的原因 [打印本页]

作者: terrytr    时间: 2014-6-15 19:50
标题: 请教大家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
本帖最后由 安靖 于 2014-6-15 20:12 编辑

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

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



作者: mangix2010    时间: 2014-6-15 22:32
应该是超过限制了,特别是大数组的时候
作者: fcode    时间: 2014-6-15 22:36
是啊。32位系统2GB内存,加上操作系统预留的,运行时库的,还有其他数组,应该是超了。

要么减少数组,要么优化算法,要么使用64位吧
作者: terrytr    时间: 2014-6-16 09:37
安靖 发表于 2014-6-15 20:06
试试增加编译选项  -heap-arrays

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

昨晚上试过了,很遗憾,还是上面说的结果。谢谢了。
作者: 安靖    时间: 2014-6-16 21:46
好像vs2010只有32版本的,但是可以编译64位的程序。你可以运行程序的时候,看下资源管理器里内存的使用情况。
照你说的至少开6个756MB的数组,这里就4G以上了,加上系统使用的内存,还有你可能漏算的开数组的内存,也有可能8G不够的。
确定是机器内存不够的话,那就可以换大机器了
作者: 山大克鲁士    时间: 2014-6-17 09:51
本帖最后由 山大克鲁士 于 2014-6-17 09:55 编辑

要么用64-bit,要么在32-bit下用多进程.
32-bit单进程啥都不改的情况下,real(8), allocatable :: a, allocate (a(15751, 15751))已经是极限了。。。
作者: 珊瑚虫    时间: 2014-6-17 19:45
使用64位平台编译
作者: terrytr    时间: 2014-6-19 12:24
珊瑚虫 发表于 2014-6-17 19:45
使用64位平台编译

仍然不行。请帮忙看下问题更新。谢谢。
作者: terrytr    时间: 2014-6-19 12:25
山大克鲁士 发表于 2014-6-17 09:51
要么用64-bit,要么在32-bit下用多进程.
32-bit单进程啥都不改的情况下,real(8), allocatable :: a, alloc ...

仍然不行。请帮忙看下问题更新。谢谢。
作者: fcode    时间: 2014-6-19 14:47
1. 电脑出现内存不足,那说明就真的快空了。所以你的 Fortran 程序实际还是用得差不多了的。
2. 我不明白你的问题2,什么叫 C++ 可以开到内存耗空?你如何判断耗空了?
3. 如果你的windows是32位的,那么你换64位IVF编译器是不行的。编译出的程序根本无法运行。你必须在64位的CPU机器,且64位的windows下,使用64位的编译器重新编译。
4. windows 有个东西,叫虚拟内存,你可以试试设置稍大一些。
5. 操作系统的内存管理,是一个复杂的问题。一些工具,比如任务管理器所显示的,只是一个参考,并不准确。
6. 不管怎样,数组的上限,这是一个编译器的行为。语法并不规定,这不会是 Fortran 与 C++ 的区别。
作者: terrytr    时间: 2014-6-20 10:37
fcode 发表于 2014-6-19 14:47
1. 电脑出现内存不足,那说明就真的快空了。所以你的 Fortran 程序实际还是用得差不多了的。
2. 我不明白你 ...

针对第2点:电脑提示了内存不足,这和第1点是一样的;
第3点中,VS2010是没有64位版本的。IVF有的,至少可以在编译时,选择64平台(plantform)进行编译。我是在64位的操作系统下,选用IVF的64位平台编译运行的。好像这是唯一的办法。windows平台下。也可能是我孤陋寡闻吧。如果大家知道,请告知;
第4点,我的虚拟内存开到了4G,而且实在不清楚,编译器是怎么利用虚拟内存的;
第5点,我也觉得是这样的;
第6点,有可能是编译器不一样的问题。
不管怎样,谢谢你的回复!
作者: fcode    时间: 2014-6-20 13:20
编译器不利用虚拟内存。编译器编译后的程序,向操作系统申请空间,操作系统再决定在内存或虚拟内存。

如果你确定是64位的CPU,64位的操作系统,64位的编译器,那么应该是没有问题的了。依然不够用,那就真的是上限了。

我认为这个问题,Fortran 与 C 没有区别。即便是编译器不同,也不会差很多。编译器都不是傻子,不会留着可用资源而不用的




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2