Arrays Fortran:虚拟内存不足

Arrays Fortran:虚拟内存不足,arrays,memory,memory-management,fortran,Arrays,Memory,Memory Management,Fortran,我不是一个专业的软件工程师,目前正在扩展一个相当大的科学软件。 在运行时,我收到一个错误,指出虚拟内存不足 在运行时的这一点上,使用的工作内存约为550mb,当动态分配相当大的三维数组时,会出现错误。该阵列(如果要分配的话)的大小约为170mb。加上已经使用的550mb,该程序仍将远低于为32位应用程序设置的2gb边界。此外,系统上有足够的可用工作内存。 Visual Studio当前设置为在堆栈上分配数组。无论如何,在堆上分配它们不会有任何区别 如果将数组拆分为较小的数组(其大小等于一个大数组

我不是一个专业的软件工程师,目前正在扩展一个相当大的科学软件。 在运行时,我收到一个错误,指出虚拟内存不足

在运行时的这一点上,使用的工作内存约为550mb,当动态分配相当大的三维数组时,会出现错误。该阵列(如果要分配的话)的大小约为170mb。加上已经使用的550mb,该程序仍将远低于为32位应用程序设置的2gb边界。此外,系统上有足够的可用工作内存。 Visual Studio当前设置为在堆栈上分配数组。无论如何,在堆上分配它们不会有任何区别

如果将数组拆分为较小的数组(其大小等于一个大数组的总和),则程序可以正常运行。所以我猜动态分配的内存必须在一个相邻的块中可用

所以我就在这里,我不知道如何解决这个问题。我无法释放部分已使用的550mb,因为数据仍然是必需的。我也不能改变很多配置,例如编译器。 我的问题有解决办法吗

提前向您表示感谢,并致以最良好的问候


phroth248

虚拟内存是程序可以寻址的内存。它通常是物理内存和交换空间的总和。例如,如果您有16GB的物理内存和4GB的交换空间,则虚拟内存将为20GB。如果您的Fortran程序试图分配超过20个可寻址GB的内存,则会出现虚拟内存不足错误

要了解3D阵列所需的内存,请执行以下操作:

allocate (A(nx,ny,nz))
您有nx*ny*nz元素,每个元素在双精度中占用8个字节,在单精度中占用4个字节。我让你算算。

有些事情: 1.通常,最好使用操作系统服务而不是语言工具来分配大型阵列。这将避免任何潜在的库问题

32位系统中的550MB可能有问题。通常会将4GB地址空间划分为一些专用区域

您需要确保有足够的虚拟内存。 a确保页面文件空间足够大。 b确保您的系统未配置为将进程地址空间大小限制为小于您需要的大小。 c确保您的帐户设置没有将进程地址空间限制为小于系统允许的大小


您必须显示您的代码。请阅读并报告您的编译器版本。我无法在这里提供数千行代码。返回错误的行如上所述只是一个数组的分配:ALLOCATE smthngx,y,z我的Fortran编译器是:IntelR Visual Fortran编译器XE 13.1.3.198这完全不够,变量是如何声明的?他们有哪些价值观?请再读一遍,仔细阅读。这是哪个操作系统?另外,我对编译器有点困惑。您是否同时使用Microsoft Visual studio和英特尔fortran编译器?是的,我使用Windows 7上的Microsoft Visual studio 2010和英特尔Visual fortran Composer XE 2013。但是无论如何,我不能改变编译器。正如我上面写的,我的数组需要170mb。我已经在运行时使用了550mb。因此,在分配阵列之后,我需要720mb的内存,这对于当今的任何系统来说都不会有问题。将数组拆分为几个较小的数组不会导致错误。因此,留给我一个假设,即内存必须是相邻的,或者以块的形式,或者以任何人可以称之为块的方式,这些都是需要解决的问题。我真的很感激。非常感谢。我想第2点是这里的问题,因为它可以将数组拆分为更小的数组。我计划在某个时候编写一种函数意义上的变通方法,将大型阵列拆分为小型阵列,同时允许以usal方式处理大型阵列。