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清除它正在使用的内存吗?我试过乱扔垃圾Share和Clear整个很多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.如果你不这样做,临时变量仍然可以从历史变量(In和Out)链接,并且由于这个原因在更广泛的情况下不会被他们的定义删除(它不是一个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)
| 归档时间: |
|
| 查看次数: |
5026 次 |
| 最近记录: |