回 帖 发 新 帖 刷新版面

主题:[讨论]关于Fortran的内存开销问题(最大数组)

今天没事随便测试了下在IVF(CVF结果相同)下能开到的最大的动态数组。

机子内存 2×2G,虚拟内存 4G,总共实际可用内存超过 7G。

当程序的二维单精度数组开到20000*20000,使用的内存大概2.06G左右(系统本身用了600M)。这是在加大数组到比如21000*21000就提示 insufficient virtual memory。所以我搞不懂为什么内存不能充分利用起来,难道是因为单根的内存是2G的缘故吗?

但是,我可以同时运行4个这样的程序,使总内存总用量达到近7G。

先谢谢各位大侠给小弟解答[em1][em1]

回复列表 (共8个回复)

沙发

你的系统是32/64位的?编译器是32/64位的?

板凳

系统和编译器都是32位的。

32位为什么不能开到4G的数组呢?如果是64位,实际应用中数组能开到多大?

3 楼

32位系统最大寻址为2的32次方,即4G内存,由于windows xp本身设计的关系,只能认最高3.25G内存。

4 楼

问题是单个数组开到内存为2G后就报虚拟内存不足了[em18][em18]

5 楼

上面我只是说32位windows系统可以识别3.25G。

对于其中的程序进程,每个进程都固定2G的虚拟地址空间(不是虚拟内存,而是实际占用内存+占用的虚拟内存),所以可以有多个进程的总内存量大于系统可识别的量。

这个解释详见msdn。

6 楼

听dongyuanxun大侠这么一说我到明白了许多。谢谢!
“每个进程都固定2G的虚拟地址空间”,这么说对于超大的数组,有没有什么方法可以成功应用?除了用64位的系统有没有什么方法突破2G?
64位的单个进程可以有多大的寻址地址空间呢?

7 楼

32位除了使用以时间换空间没有任何其他方法,而以时间换空间是指以数组的一部分参与运算(一般以文件为媒介),部分运算完再进行整合,这也意味着要把既有的算法全部修改。此外,32位Linux倒是没有2G或者3.25G的限制,只有4G的限制。
64位你就不用管多少内存了,现在PC机肯定装不了那么多内存 2^64Byte=17179869184G

8 楼

非常感谢[em2][em2][em2]

我来回复

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