Fortran Coder

查看: 23470|回复: 5
打印 上一主题 下一主题

[求助] 计算中,大数组导致的内存不足

[复制链接]

4

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
22 点
跳转到指定楼层
楼主
发表于 2015-1-24 18:18:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
编写了一个程序,其中有12个四维数组,比如:u(6,100,100,204),v(6,100,100,204)等。因为计算需要,我把数组改写成了u(6,200,200,204)。编译时出现这个错误LNK1248: image size ('size') exceeds maximum allowable size (80000000)           按照网上的一些做法,把原本为静态数组的数组,改为了动态数组,但是会出现图中的错误

我刚才看了下论坛里相关的问题,里面的解决办法对我这个没有太大的帮助。



有几个问题请教一下:
    1.电脑为WIN764位系统+IVF2013,理论上能开的最大的数组有多大?
    2.数组的数量和大小,对内存的要求高吗?(8G内存)
下面为程序的一部分,这个问题困扰很久。希望大家能提供些帮助,谢谢!

[Fortran] 纯文本查看 复制代码
module sanguan
          implicit none
          DOUBLE PRECISION,allocatable::u(:,:,:,:),f(:,:,:,:),
     ?                              g(:,:,:,:),h(:,:,:,:) 
          DOUBLE PRECISION,allocatable :: ux(:,:,:,:),uy(:,:,:,:),
     ?                   uz(:,:,:,:),fx(:,:,:,:), gy(:,:,:,:),
     ?                    hz(:,:,:,:)    
          DOUBLE PRECISION,allocatable :: ut(:,:,:,:),ft(:,:,:,:),
     ?                   gt(:,:,:,:),ht(:,:,:,:) 


      end module

          program ex001
          use sanguan
          IMPLICIT DOUBLE PRECISION (a-h,o-z)


          PARAMETER (ijn=6,ixmax=200,jymax=200,kzmax=204)

          common /commu01/ timec,phyin(40000,5),nin


          common /par01/ gam,ak,EdRu,qin
          common /out02/ timemax,ntime,nprint 
          common /out00/ iop
          common /out10/ dx,dy,dz,dt,imax,jmax,kmax,
     ?                   ib1,ib2,jb1,jb2,kb


          common /out21/ a(ijn,ijn),b(ijn,ijn),c(ijn,ijn)
          common /out22/ uxij(2,ijn), uyij(2,ijn), uzij(2,ijn),
     ?                  udxij(2,ijn),udyij(2,ijn),udzij(2,ijn)
          common /out23/ qijk(6,ijn)
          common /out24/ sita(8,ijn),wwww(8,ijn),
     ?                    uxc(8,ijn),uyc(8,ijn),uzc(8,ijn)
          common /out25/ xycir5(3,2),ncir(3),mcircle(3,ixmax,2)
          common /out26/ nwork,njet(3),phycir(5,ijn)
          common /out27/ dtin
common /output02/ tjet(3)

allocate(u(6,200,200,204))
          allocate(f(6,200,200,204))
          allocate(g(6,200,200,204))
          allocate(h(6,200,200,204))                             
          allocate(ux(6,200,200,204))
          allocate(uy(6,200,200,204))        
          allocate(uz(6,200,200,204))         
          allocate(fx(6,200,200,204))
          allocate(gy(6,200,200,204))
          allocate(hz(6,200,200,204))        
          allocate(ut(6,200,200,204))         
          allocate(ft(6,200,200,204))
          allocate(gt(6,200,200,204))         
          allocate(ht(6,200,200,204))

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

沙发
发表于 2015-1-24 19:14:06 | 只看该作者
语法没有对数组大小进行限制,而限制来源于具体的操作环境。

6*200*200*204 = 48960000

因为是双精度的,每个数据8字节,所以一共 48960000*8 = 391680000 字节 = 382500 KB = 373.5 MB

12个这样的数组,一共 4482.4 MB,也就是 4.5GB

32位系统可以最大的寻址是 2**32 = 4GB,实际上 Windows 限定为 2GB,除去操作系统本身之外,实际可用的内存只有1.2GB左右。
64位系统则更大一些,但这需要你的编译器也是64位的。

具体可利用的内存还受其他因素影响。

楼主可尝试使用64位编译器编译,并开启大数组地址支持。或者考虑在算法上修改,提高内存重复使用率。

4

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
22 点
板凳
 楼主| 发表于 2015-1-24 22:11:35 | 只看该作者
fcode 发表于 2015-1-24 19:14
语法没有对数组大小进行限制,而限制来源于具体的操作环境。

6*200*200*204 = 48960000

果然是高手,解释的非常清楚,谢谢。我安装的是visual studio 2010版和IVF 2013. 下载的时候都是下载的64位的。但是从《Fortran 95 程序设计》【彭国伦】一书中P148页里面的小程序来计算我的电脑能承受2G的数组,从上面你的分析来看,离4.5G的需求,确实不够。本身是8G内存,如果按照你的建议。我在安装了合适的64位编译器之后,再开启最大数组地址支持,应该可以实现。
但是我现在的问题是:
1. 如何确定自己正确安装了64位编译器?
2.怎么开启最大数组地址支持?

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2015-1-25 08:35:39 | 只看该作者
IVF 的 32 位和 64位是在一起安装的。即便你安装了,也需要切换到64位来编译。

你可以在工程属性之类的地方找到。

这些问题,都可参考这个帖子:
http://bbs.fcode.cn/thread-448-1-1.html

4

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
22 点
5#
 楼主| 发表于 2015-1-25 18:46:56 | 只看该作者
楚香饭 发表于 2015-1-25 08:35
IVF 的 32 位和 64位是在一起安装的。即便你安装了,也需要切换到64位来编译。

你可以在工程属性之类的地 ...

谢谢,按照上面的方法。暂时解决了目前这个大小的数值。不过后面还想再加大数组,是不是得考虑算法改进,或者搞并行计算了。。。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

6#
发表于 2015-1-25 20:02:04 | 只看该作者
任何时候,算法改进都是需要考虑的。而不是硬件条件不够了再考虑。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-1 22:57

Powered by Tencent X3.4

© 2013-2024 Tencent

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