我有一个类似的问题: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}
似乎所有的内存控制都只适用于主内核?到目前为止,唯一的方法是关闭所有内核并重新启动它们。
我真的希望有一些解决方案。。。非常感谢。
内存控制适用于内核,其中控制表达式涉及MemoryConstrained
、MemoryInUse
、Clear
、Unset
、Remove
、$HistoryLength
、ClearSystemCache
等函数进行评估。在您的情况下,内存泄漏的来源似乎不是因为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}
如果你愿意,你可以选择任何其他方法,但我在最后几分钟内就成功了。此外,我以前遇到的许多令人讨厌的不一致性都消失了,集成进行得更快。