Mathematica中的子内存内存控制

Mic*_*ett 5 memory parallel-processing wolfram-mathematica mathematica-8

我有一个类似的问题: Mathematica耗尽内存

我对以下内容感兴趣:

ParallelTable[F[i], {i, 0, 14.9, 0.001}]
Run Code Online (Sandbox Code Playgroud)

哪里F[i]是一个复杂的数值积分(我还没有找到一种简单的方法来重现问题,而没有页面填充定义的积分).

我的问题是子内核在内存中爆炸,如果我不让机器交换,我必须停止评估.

但即使我已经停止评估,内核也不会释放他们占用的内存.

ClearSystemCache[] 
Run Code Online (Sandbox Code Playgroud)

我甚至试过了

ParallelEvaluate[ClearSystemCache[]]
Run Code Online (Sandbox Code Playgroud)

ParallelEvaluate[MemoryInUse[]]
Run Code Online (Sandbox Code Playgroud)

留在

{823185944, 833146832, 812429208, 840150336, 850057024, 834441704, 
847068768, 850424224}
Run Code Online (Sandbox Code Playgroud)

似乎所有内存控制只适用于主内核?到目前为止,唯一的方法是关闭所有内核并再次启动它们.

我真的希望有一些解决方案...非常感谢.

Ale*_*kov 3

内存控制适用于内核,其中计算涉及MemoryConstrainedMemoryInUseClearUnsetRemove$HistoryLength等函数ClearSystemCache 的控制表达式。在您的情况下,内存泄漏的根源似乎不是由于Mathematica的内部缓存机制(感谢您的链接,顺便说一句!)。

$HistoryLength=0;在使用它们进行计算之前,您是否尝试过在所有子内核中进行评估?如果您还没有,我强烈建议您尝试一下。

由于您正在使用数值积分函数,我建议还尝试优化它们的使用。例如,如果您使用NDSolve有限的一组计算点(甚至是唯一的一个点)进行数值积分,则应该使用形式NDSolve[eqns,y,{x,x_needed_min,x_needed_max}](甚至NDSolve[eqns,y,{x,x_max,x_max}])而不是NDSolve[eqns,y,{x,x_min,x_max}]NDSolve[eqns,y,{x,0,x_max}]。在某些情况下,这可以显着减少内存使用量!您还可以用于EventLocator内存控制