减少扩展的Mathematica会话中的内存使用量

Mik*_*ley 14 memory-leaks memory-management wolfram-mathematica

我正在做一些相当长的计算,这可能很容易跨越几天.在这些计算过程中,有时Mathematica会耗尽内存.为此,我最终采取了以下措施:

ParallelEvaluate[$KernelID]; (* Force the kernels to launch *)
kernels = Kernels[];

Do[
   If[Mod[iteration, n] == 0,
      CloseKernels[kernels];
      LaunchKernels[kernels];
      ClearSystemCache[]];
   (* Complicated stuff here *)
   Export[...], (* If a computation ends early I don't want to lose past results *)
   {iteration, min, max}]
Run Code Online (Sandbox Code Playgroud)

这很好,但是随着时间的推移,主内核会累积内存.目前,我的主要内核占用大约1.4 GB的RAM.有什么方法可以强迫Mathematica清除它正在使用的内存吗?我试过乱扔垃圾ShareClear整个很多Modules,我用我的代码,但记忆似乎仍然在时间来建立.

我也试图确保在a之外没有任何大而复杂的运行Module,因此某些东西不会在范围内停留太长时间.但即便如此,我仍然有记忆问题.

我能做些什么吗?我总是会使用大量的内存,因为我的大多数计算涉及几个大而密集的矩阵(通常是1200 x 1200,但它可能更多),所以我对使用它很谨慎MemoryConstrained.


更新:

问题正是Alexey Popkov在他的回答中所说的.如果使用Module,内存会随着时间缓慢泄漏.在这种情况下,它恰好加剧了,因为我有多个Module[..]陈述."main" Module位于ParallelTable8个内核同时运行的位置.解决(相对)大量迭代问题,这是导致大量内存泄漏的滋生地Module.

Ale*_*kov 10

由于您正在Module广泛使用,我认为您可能有兴趣了解非删除临时变量的错误Module.

示例(不删除未链接的临时变量及其定义):

In[1]:= $HistoryLength=0;
a[b_]:=Module[{c,d},d:=9;d/;b===1];
Length@Names[$Context<>"*"]

Out[3]= 6

In[4]:= lst=Table[a[1],{1000}];
Length@Names[$Context<>"*"]

Out[5]= 1007

In[6]:= lst=.
Length@Names[$Context<>"*"]

Out[7]= 1007

In[8]:= Definition@d$999

Out[8]= Attributes[d$999]={Temporary}

d$999:=9
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的代码中我设置$HistoryLength = 0;了强调这种错误的行为Module.如果你不这样做,临时变量仍然可以从历史变量(InOut)链接,并且由于这个原因在更广泛的情况下不会被他们的定义删除(它不是一个bug而是一个功能,正如Leonid所提到的).

更新:仅供记录.在v.5.2中对它们进行赋值后,还有另一个旧的错误,其中包含非删除的未引用Module变量,Part即使在版本7.0.1中也没有完全修复:

In[1]:= $HistoryLength=0;$Version
Module[{L=Array[0&,10^7]},L[[#]]++&/@Range[100];];
Names["L$*"]
ByteCount@Symbol@#&/@Names["L$*"]
Out[1]= 7.0 for Microsoft Windows (32-bit) (February 18, 2009)
Out[3]= {L$111}
Out[4]= {40000084}
Run Code Online (Sandbox Code Playgroud)