Mathematica中的子内核内存控制



我有一个类似的问题:Mathematica内存不足

我对这样的东西感兴趣:

ParallelTable[F[i], {i, 0, 14.9, 0.001}]

其中F[i]是一个复杂的数值积分(我还没有找到一种简单的方法来重现这个问题,而不需要对积分进行页面填充定义(。

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

但是,即使我停止了评估,内核也不会释放它们占用的内存。

ClearSystemCache[] 

我甚至试过

ParallelEvaluate[ClearSystemCache[]]

但是

ParallelEvaluate[MemoryInUse[]]

停留在

{823185944, 833146832, 812429208, 840150336, 850057024, 834441704, 
847068768, 850424224}

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

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

内存控制适用于内核,其中控制表达式涉及MemoryConstrainedMemoryInUseClearUnsetRemove$HistoryLengthClearSystemCache等函数进行评估。在您的情况下,内存泄漏的来源似乎不是因为Mathematica的内部缓存机制(感谢链接,BTW!(。

在使用所有子内核进行计算之前,您是否尝试过评估它们中的$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进行内存控制。

我几乎逐字逐句地遇到了完全相同的问题。我只是运气不错,在问题积分中添加了选项:

Method-> {"GlobalAdaptive", "SymbolicProcessing"->False}

如果你愿意,你可以选择任何其他方法,但我在最后几分钟内就成功了。此外,我以前遇到的许多令人讨厌的不一致性都消失了,集成进行得更快。

最新更新