我 - 不是专业的软件工程师 - 我正在扩展一个非常大的科学软件。 在运行时,我收到一条错误,指出虚拟内存不足"。
此时在运行时期间,使用的工作内存大约为550mb,并且当动态分配相当大的三维数组时,错误会产生错误。数组 - 如果它将被分配 - 将大约170mb的大小。将此添加到已使用的550mb程序中,该程序仍将低于为32位应用程序设置的2gb边界。此外,系统上还有足够的工作内存。 Visual Studio当前设置为在堆栈上分配数组。无论如何,在堆上分配它们并没有任何区别。
将数组拆分为较小的数组(总和为一个大数组的大小)会导致程序运行正常。所以我想动态分配的内存必须在一个相邻的块中可用。
所以我在那里,我不知道如何解决这个问题。由于仍然需要数据,我无法释放一些已经使用过的550mb。我也无法改变很多配置(例如编译器)。 我的问题有解决方案吗?
先谢谢你们,并提出最好的问候
phroth248
答案 0 :(得分:1)
虚拟内存是程序可以处理的内存。它通常是物理内存和交换空间的总和。例如,如果您有16GB的物理内存和4GB的交换空间,则虚拟内存将为20GB。如果您的Fortran程序尝试分配超过那20个可寻址的GB,那么您将得到一个“不足”的虚拟内存"错误。
要了解3D阵列所需的内存:
allocate (A(nx,ny,nz))
您有nx*ny*nz
个元素,每个元素在双精度中占用8个字节,在单个精度中占用4个字节。我让你做数学。
答案 1 :(得分:0)
有些事情: 1.通常最好使用操作系统服务而不是语言工具来分配大型数组。这将绕过任何潜在的库问题。
在32位系统中,您可能遇到550MB的问题。通常将4GB地址空间划分为专用区域。
您需要确保拥有足够的虚拟内存。 a)确保页面文件空间足够大。 b)确保您的系统未配置为将进程地址空间大小限制为小于您需要的空间大小。 c)确保您的帐户设置不会将您的进程地址空间限制为小于系统允许的空间。