回 帖 发 新 帖 刷新版面

主题:求助大家,怎样内存才可以超过256M

我因为计算的要求,数组要取到很大,而且有好几个
这样超过了256M的内存,出现了负数超过
网上搜索过后,发现解决意见主要是:
1,升级到64位的编译器
2,用动态数组
我现在的疑问是,
第一个,升级到64位的编译器后,真的就可以突破256M了么?我怕重装了系统,重装了编译器,结果还是不行,麻烦有经验的同学说下。我现在在装intel visual fortran跟visual studio 2005,我原来用的是power station 4.0,请问我原来的程序可以直接用在新装的编译器么?
第二个,我的大型数组很多,我看到别人的例子里用了模块定义动态数组,然后每次用模块,但是我的很多程序都是整个程序里都要用到的,释放不了,还有很多在子程序的虚参里,我把程序里的数组贴上来,麻烦大家帮我想想办法呢,有点着急啊。
先谢谢大家了
数组的话我有 DIMENSION XX(120),YY(120),PR(4096,4096),PI(4096,4096),
 &FR(4096,4096),FI(4096,4096),
 &YLR(4096*4096,4),YLI(4096*4096,4),
 &YBR(4096*4096,4),YBI(4096*4096,4),EL(4096*4096)
这些数组我在一些子程序里都是作为了虚参使用

 CALL FFT(PR,PI,N,K,FR,FI)
 CALL IFFT(FR,FI,N,K,PR,PI)

我用了 模块来定义动态数组

MODULE ZZLL
 DOUBLE PRECISION,ALLOCATABLE::YLR(:,:),YLI(:,:),YBR(:,:),
 &YBI(:,:),EL(:)
 END MODULE ZZLL


 MODULE ZCX
 DOUBLE PRECISION,ALLOCATABLE::PR(:,:),PI(:,:),FR(:,:),FI(:,:)
 END MODULE ZCX

 

可是只能释放
PR(:,:),PI(:,:),FR(:,:),FI(:,:)数组

其他的数组整个程序过程中都需用到

运行时还是出现了错误说 error F6772

cannot allocate allocatable--out of memory

现在怎么办才好呢,visual studio 2005还在下载中,求大家帮帮忙啊



 

 

回复列表 (共9个回复)

沙发

http://bbs.pfan.cn/post-365635.html
搜一搜旧帖子,可能就会对你有帮助。你的内存只有256M吗?换个内存应该可以吧。另外可能就是,借助文件,在计算过程中,先计算部分数组,其余的写入文件,前面的数组计算完了,再从文件里读入,计算后面的数组。。。希望有帮助

板凳


我查了下,貌似是fortran就只支持256M的内存的,我的电脑内存是2G的。借助文件这个我还真没试过,你的意思是说把数据放进文件,然后释放相关的数组么?主要是我的数组有4个(4096*4096,4)这么大的,还有其他大型的数组,光前面几个数组貌似就超了。这样写进文件也没用了?

3 楼

[quote]
我查了下,貌似是fortran就只支持256M的内存的,我的电脑内存是2G的。借助文件这个我还真没试过,你的意思是说把数据放进文件,然后释放相关的数组么?主要是我的数组有4个(4096*4096,4)这么大的,还有其他大型的数组,光前面几个数组貌似就超了。这样写进文件也没用了?[/quote]

你在哪里查到的?应该不止256MB吧,如果你机器是32位系统的话,每个进程有2G的虚拟地址空间,你的应该是超了2G了,光一个(4096,4096,4)就是256M,你那有好几个需要全程使用。借助文件是个方法,花时间一点,就是把暂时不用的数据写入文件,释放内存空间,用到的时候再读入。最终极的就是换系统和编译器。
看这个 http://bbs.pfan.cn/post-307843.html
1、如果是Fortran77那种,直接分配一个很大的数组而实际用不了那么多了,计算出实际需要后进行动态分配;
2、如果1的情况不成立,改双精度为单精度试试看;
3、如果1和2都无效,加内存;
3、如果1、2和3都无效,加内存,换64位的操作系统和编译器;
4、若1、2、3和4全无效,修改算法,或者找台服务器

4 楼

[quote][quote]
我查了下,貌似是fortran就只支持256M的内存的,我的电脑内存是2G的。借助文件这个我还真没试过,你的意思是说把数据放进文件,然后释放相关的数组么?主要是我的数组有4个(4096*4096,4)这么大的,还有其他大型的数组,光前面几个数组貌似就超了。这样写进文件也没用了?[/quote]
你在哪里查到的?应该不止256MB吧,如果你机器是32位系统的话,每个进程有2G的虚拟地址空间,你的应该是超了2G了,光一个(4096,4096,4)就是256M,你那有好几个需要全程使用。借助文件是个方法,花时间一点,就是把暂时不用的数据写入文件,释放内存空间,用到的时候再读入。最终极的就是换系统和编译器。
看这个 http://bbs.pfan.cn/post-307843.html
1、如果是Fortran77那种,直接分配一个很大的数组而实际用不了那么多了,计算出实际需要后进行动态分配;
2、如果1的情况不成立,改双精度为单精度试试看;
3、如果1和2都无效,加内存;
3、如果1、2和3都无效,加内存,换64位的操作系统和编译器;
4、若1、2、3和4全无效,修改算法,或者找台服务器[/quote]
太谢谢你啦,我对这个内存不大了解,我建立的时候显示是一个负数超过了256M,这个意思是说我超过2G了吧?我用fortran77 编的呢,现在编译器用的是power station4.0。我的大型数组的定义,都是实际就是要用这么大的呢。按照你说的改双精度为单精度,4096的数组我已经通过了,能算了。但是我之后还要再做三维数组,那么要求就更大了。我准备尝试借助文件的办法,我想再请教下:

1.你建议的第三条加内存是说加电脑内存然后换64位的操作系统么?我现在电脑内存是2.5G,系统是32位,如果加到64位,能提高到多少呢?power station4.0支持64位的么?我发现同样的程序到visual studio,编译就出现很多错误。我想这个是不是作为最后退路了。毕竟我不是学计算机的,这方面太不懂了。

2.用文件存数据的话,因为我是在循环里面,有办法可以每次储存把文件里之前的内容清楚么?

3.我定义的那些动态数组,释放了以后,可以继续在程序里再赋值,再释放这么循环使用么?

我想现在还是集中考虑精简算法跟使用文件储存,真的是谢谢你的指导

5 楼

一个负数超过了256M?可能是编译器的原因吧。内存不够应该是out of memory.
那列出来的建议是在论坛的旧帖子里找到的,不是我的。。。呵呵
1. 换64位操作系统和64位FORTRAN编译器。这样就没有单线程2G的限制了,内存有多大就可以用多大,加内存就可以了。power station没用过,用的IVF,不知道支持不支持,你去搜一搜。visual studio?你是说power station+visual studio还是intel visual fortran+visual studio?有错误原因可能有很多,我不清楚power station,所以不知道。。。但是ivf和vs组合用的很好。这个方法肯定可以算很大内存的程序的。
2. 可以每次写入文件之前,清除之前的内容,方法很多。例如,open(unit=fileid, file="1.data",status=“replace”)用status来清除。或者,open完一次后记得close文件,下次再open默认从开头开始抹去之前的内容,ivf里是这样的。
3. 我觉得应该可以吧,你写个小程序试一下,先allocate,然后deallocate,再allocate,看看行不行。
不客气

6 楼

[quote]一个负数超过了256M?可能是编译器的原因吧。内存不够应该是out of memory.
那列出来的建议是在论坛的旧帖子里找到的,不是我的。。。呵呵
1. 换64位操作系统和64位FORTRAN编译器。这样就没有单线程2G的限制了,内存有多大就可以用多大,加内存就可以了。power station没用过,用的IVF,不知道支持不支持,你去搜一搜。visual studio?你是说power station+visual studio还是intel visual fortran+visual studio?有错误原因可能有很多,我不清楚power station,所以不知道。。。但是ivf和vs组合用的很好。这个方法肯定可以算很大内存的程序的。
2. 可以每次写入文件之前,清除之前的内容,方法很多。例如,open(unit=fileid, file="1.data",status=“replace”)用status来清除。或者,open完一次后记得close文件,下次再open默认从开头开始抹去之前的内容,ivf里是这样的。
3. 我觉得应该可以吧,你写个小程序试一下,先allocate,然后deallocate,再allocate,看看行不行。
不客气[/quote]
恩恩,太谢谢你啦

7 楼


不客气,对你有帮助就好

8 楼

居然还有人照抄偶当年的回帖。。。。

9 楼

[quote]居然还有人照抄偶当年的回帖。。。。
[/quote]

搜旧帖子的时候搜到的。。。旧帖子的链接也在回帖里标出来了。。。
回答的很全面,所以就贴出来了,学习了,嘿嘿

我来回复

您尚未登录,请登录后再回复。点此登录或注册