Fortran Coder

查看: 27572|回复: 12
打印 上一主题 下一主题

[求助] 请教大家allocate开不了大数组的原因

[复制链接]

5

帖子

1

主题

0

精华

入门

F 币
34 元
贡献
18 点
跳转到指定楼层
楼主
发表于 2014-6-15 19:50:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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为什么开不了?小弟诚心请教大家。谢谢了!
分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
沙发
发表于 2014-6-15 20:06:25 | 只看该作者
本帖最后由 安靖 于 2014-6-15 20:12 编辑

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

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


评分

参与人数 1F 币 +9 贡献 +9 收起 理由
fcode + 9 + 9 赞一个!

查看全部评分

35

帖子

2

主题

1

精华

专家

超子

F 币
565 元
贡献
196 点

规矩勋章

QQ
板凳
发表于 2014-6-15 22:32:52 | 只看该作者
应该是超过限制了,特别是大数组的时候

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1341 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2014-6-15 22:36:13 | 只看该作者
是啊。32位系统2GB内存,加上操作系统预留的,运行时库的,还有其他数组,应该是超了。

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

5

帖子

1

主题

0

精华

入门

F 币
34 元
贡献
18 点
5#
 楼主| 发表于 2014-6-16 09:37:23 | 只看该作者
安靖 发表于 2014-6-15 20:06
试试增加编译选项  -heap-arrays

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

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

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
6#
发表于 2014-6-16 21:46:22 | 只看该作者
好像vs2010只有32版本的,但是可以编译64位的程序。你可以运行程序的时候,看下资源管理器里内存的使用情况。
照你说的至少开6个756MB的数组,这里就4G以上了,加上系统使用的内存,还有你可能漏算的开数组的内存,也有可能8G不够的。
确定是机器内存不够的话,那就可以换大机器了

18

帖子

3

主题

0

精华

熟手

F 币
116 元
贡献
73 点
7#
发表于 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))已经是极限了。。。

135

帖子

15

主题

0

精华

版主

F 币
1159 元
贡献
637 点

爱心勋章管理勋章

8#
发表于 2014-6-17 19:45:27 | 只看该作者
使用64位平台编译

5

帖子

1

主题

0

精华

入门

F 币
34 元
贡献
18 点
9#
 楼主| 发表于 2014-6-19 12:24:51 | 只看该作者
珊瑚虫 发表于 2014-6-17 19:45
使用64位平台编译

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

5

帖子

1

主题

0

精华

入门

F 币
34 元
贡献
18 点
10#
 楼主| 发表于 2014-6-19 12:25:13 | 只看该作者
山大克鲁士 发表于 2014-6-17 09:51
要么用64-bit,要么在32-bit下用多进程.
32-bit单进程啥都不改的情况下,real(8), allocatable :: a, alloc ...

仍然不行。请帮忙看下问题更新。谢谢。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-23 16:06

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表