【问题标题】:Subkernel memory control in MathematicaMathematica 中的子内核内存控制
【发布时间】:2011-10-10 00:32:34
【问题描述】:

我有一个类似的问题: Mathematica running out of memory

我对这样的事情很感兴趣:

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

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

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

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

ClearSystemCache[] 

我也试过了

ParallelEvaluate[ClearSystemCache[]]

但是

ParallelEvaluate[MemoryInUse[]]

留在

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

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

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

【问题讨论】:

    标签: memory wolfram-mathematica parallel-processing mathematica-8


    【解决方案1】:

    我(是?)遇到了完全相同的问题,几乎是逐字逐句。我只是幸运地将选项添加到问题积分中:

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

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

    【讨论】:

      【解决方案2】:

      内存控制适用于内核,其中控制表达式涉及MemoryConstrainedMemoryInUseClearUnsetRemove$HistoryLengthClearSystemCache 等函数。 em> 被评估。在您的情况下,内存泄漏的来源似乎不是由于Mathematica's internal caching mechanism(感谢您的链接,顺便说一句!)。

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

      由于您正在使用数值积分函数,我建议您也尝试优化它们的使用。例如,如果您使用NDSolve 进行数值积分并且只需要一组有限的计算点(甚至是唯一的一个点),您应该使用use the form NDSolve[eqns,y,{x,x_needed_min,x_needed_max}] (or even NDSolve[eqns,y,{x,x_max,x_max}]) instead of NDSolve[eqns,y,{x,x_min,x_max}] or NDSolve[eqns,y,{x,0,x_max}]。在某些情况下,这可以显着减少内存使用量!你也可以use EventLocator for memory control

      【讨论】:

      • 所以我现在将我的问题提交给了 wolfram 支持,看来 NIntegrate 确实存在内存泄漏。我可以使用 ClearSystemCache 管理我的泄漏,但这不适用于并行评估,因为 ClearSystemCache 不会影响由并行评估启动的子内核。我会更新我得到的任何进一步信息。
      • @Michael 如果是这样,可能在所有子内核中评估 ClearSystemCache[] 会有所帮助吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2012-01-30
      • 1970-01-01
      • 2014-02-15
      • 2012-04-06
      相关资源
      最近更新 更多