主题:[讨论]关于Fortran的内存开销问题(最大数组)
airchampion
[专家分:0] 发布于 2011-05-07 17:13:00
今天没事随便测试了下在IVF(CVF结果相同)下能开到的最大的动态数组。
机子内存 2×2G,虚拟内存 4G,总共实际可用内存超过 7G。
当程序的二维单精度数组开到20000*20000,使用的内存大概2.06G左右(系统本身用了600M)。这是在加大数组到比如21000*21000就提示 insufficient virtual memory。所以我搞不懂为什么内存不能充分利用起来,难道是因为单根的内存是2G的缘故吗?
但是,我可以同时运行4个这样的程序,使总内存总用量达到近7G。
先谢谢各位大侠给小弟解答[em1][em1]
回复列表 (共8个回复)
沙发
dongyuanxun [专家分:7180] 发布于 2011-05-07 17:36:00
你的系统是32/64位的?编译器是32/64位的?
板凳
airchampion [专家分:0] 发布于 2011-05-07 17:42:00
系统和编译器都是32位的。
32位为什么不能开到4G的数组呢?如果是64位,实际应用中数组能开到多大?
3 楼
dongyuanxun [专家分:7180] 发布于 2011-05-07 18:26:00
32位系统最大寻址为2的32次方,即4G内存,由于windows xp本身设计的关系,只能认最高3.25G内存。
4 楼
airchampion [专家分:0] 发布于 2011-05-07 19:21:00
问题是单个数组开到内存为2G后就报虚拟内存不足了[em18][em18]
5 楼
dongyuanxun [专家分:7180] 发布于 2011-05-07 21:11:00
上面我只是说32位windows系统可以识别3.25G。
对于其中的程序进程,每个进程都固定2G的虚拟地址空间(不是虚拟内存,而是实际占用内存+占用的虚拟内存),所以可以有多个进程的总内存量大于系统可识别的量。
这个解释详见msdn。
6 楼
airchampion [专家分:0] 发布于 2011-05-07 23:00:00
听dongyuanxun大侠这么一说我到明白了许多。谢谢!
“每个进程都固定2G的虚拟地址空间”,这么说对于超大的数组,有没有什么方法可以成功应用?除了用64位的系统有没有什么方法突破2G?
64位的单个进程可以有多大的寻址地址空间呢?
7 楼
dongyuanxun [专家分:7180] 发布于 2011-05-07 23:19:00
32位除了使用以时间换空间没有任何其他方法,而以时间换空间是指以数组的一部分参与运算(一般以文件为媒介),部分运算完再进行整合,这也意味着要把既有的算法全部修改。此外,32位Linux倒是没有2G或者3.25G的限制,只有4G的限制。
64位你就不用管多少内存了,现在PC机肯定装不了那么多内存 2^64Byte=17179869184G
8 楼
airchampion [专家分:0] 发布于 2011-05-08 09:18:00
非常感谢[em2][em2][em2]
我来回复