如果不知道你的程序在做什么操作,这很难说。但是由于您有很多剩余的空闲内存,您可能正在运行内存
碎片
问题而不是彻底的内存耗尽。当你分配一个Matlab数组时,它是从现有的内存空间中分割出来的。当您清除该数组时,内存被释放回池(在C
malloc
级别)。但是,这个块不一定会与其他被释放的块合并,生成更大的块。如果随着时间的推移分配了很多数组,那么就会将内存分成小块,这样就不能再分配大的数组了,即使您总共有很多可用的内存。
matlab函数
内存()
会给你一些数据来帮助你诊断。让您的程序运行它并显示结果。查找“Maximum possible array”/“maxpossible raybytes”值。如果这比你可用的总内存小很多,那么你就有了碎片。
除非你得到的内存不足错误明确地说它是一个Java堆OOM(与常规OOM相反),不要麻烦弄乱你的Java设置;那没用的。
不幸的是,修复内存碎片需要首先修改代码来分配更少的数组。单元格字符串、字符串和包含许多小数组的单元格或对象是导致碎片的常见原因。切换到分类数组和表格会有很大帮助。
至于在64位操作系统上运行良好的32位应用程序:IIRC,在32位Windows上,操作系统为自己保留了虚拟内存的上半部分空间,因此用户程序只能使用2gb的RAM。但在64位的Windows上,这被删除了,所以32位的程序可以使用完整的4gb虚拟内存空间。这可能足够让你跨过这个门槛了。在那里
是
一个32位Windows上的内核设置来修改东西,让用户程序得到3gb而不是2gb,这也可能对你有帮助。(谷歌“Windows 3gb switch”详情)