MATLAB是否在恒定空间中执行基本数组操作?

时间:2013-08-02 21:57:12

标签: matlab memory

我在这行MATLAB代码中出现内存不足错误:

result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
         A(2:xmax+1,2:ymax+1,2:zmax+1) .* B(1:xmax,1:ymax,1:zmax)) ./ C

其中C是另一个数组。这是在32位MATLAB上(我现在似乎无法获得64位版本,这将暂时解决我的问题)。

数组结果,A,B和C是预先初始化的,永远不会改变大小。然后我的猜测是这个计算不是在恒定的空间中进行的。

这是对的吗?有没有办法让它运行或检查它是否在恒定的空间中运行?

这些数组是近似大小(250,250,250)。

如果MATLAB没有以恒定大小运行,那么是否有人对Octave或Julia或(插入类似语言)是否有任何经验?

编辑1:

我删除了多余的数组。共有10个阵列,分别为258 x 258 x 338,相当于1.67 GB。还有很多其他变量,但它们要小得多。所提出的计算是简化的,计算的形式是:

R = (A(3Drange) .* B(3Drange) + A(new_3Drange) .* D(new_3Drange) + . . . ) ./ C

其中范围通常仅相差正负1或2。

内存命令的输出:

Maximum possible array:    669 MB (7.013e+08 bytes) *
Memory available for all arrays:   1541 MB (1.616e+09 bytes) **
Memory used by MATLAB:   2209 MB (2.316e+09 bytes)
Physical Memory (RAM):   8154 MB (8.550e+09 bytes)

*  Limited by contiguous virtual address space available.
** Limited by virtual address space available.

显然我应该违反第二行。但是,代码运行正常,直到我实际对数组执行的第一个操作。当我输入时,MATLAB可能很懒,而不是分配:

A=zeros(xmax+2,ymax+2,zmax+2); 

但仍在工作区告诉我变量已分配。

此代码以前使用较小的数组。 (编辑:但似乎实际的内存大小是问题,而不是每个单独数组的大小)。

对我来说非常好奇的是它为什么在分配期间没有错误,而是在第一次计算时出错。

编辑2:

我已经确认循环在空间中没有运行恒定。在计算过程中分配了大约.8 GB的内存。以下是在循环中执行命令时资源使用情况的图像: CPU usage during the loop 但是,我尝试将计算分解为多行。我在每次添加时拆分计算,并在新命令的每个部分上添加,将R视为累加器。结果是一次分配的内存更少,但可能更频繁。这是图片:CPU usage during the new loop

我仍然很好奇MATLAB为什么不想在恒定的空间中执行它。我认为它可能与索引被转移有关 - 我打算稍后调查它然后将这些全部放在一个答案中,但有人可能会打败我,这也很棒。但是,现在,我可以运行我正在寻找的数组大小,并可以完成我的项目。

1 个答案:

答案 0 :(得分:0)

我想大部分问题已经得到了回答:

它是否在恒定空间内运行?

不,因为你验证了,它没有。

为什么它不能在恒定的空间内运行?

Matlab声称要快速进行矢量化矩阵运算,而不是过分强调内存效率。

现在该怎么办?

以下是不同的选项,如果可能的话,第一个是首选,其他两个肯定是可能的。

  1. 使其适合,例如升级到64位matlab或不在工作区中放置其他stuf
  2. 对矩阵的某些部分进行处理,例如将其切成两半
  3. 根本不使用矢量化,而是制作一个简单的for循环
  4. 如果你没有矢量化,你将有一个最小的空间解决方案。