【问题标题】:Profiling memory usage in Mathematica在 Mathematica 中分析内存使用情况
【发布时间】:2011-03-26 00:52:37
【问题描述】:

除了为他们的 Eclipse 插件(mathematica 工作台、iirc)支付 $$$ 之外,还有什么方法可以分析 mathkernel 内存使用情况(细化到单个变量)?

现在我完成了一个需要多 GB 内存的程序的执行,但唯一存储的内容应该是最多约 50MB 的数据,但 mathkernel.exe 往往会保留约 1.5GB(基本上一样多)正如 Windows 将提供的那样)。除了保存我需要的数据并每次退出内核之外,有没有更好的方法来解决这个问题?

编辑:我刚刚了解了 ByteCount 函数(它在基本数据类型上显示了一些令人不安的结果,但这不是重点),但即使是我所有变量的总和也远不及 mathkernel 占用的数量。什么给了?

【问题讨论】:

  • Mathematica 工作台目前免费。

标签: profiling memory-management wolfram-mathematica


【解决方案1】:

许多用户没有意识到的一件事是,无论您是否将输出分配给变量,都需要将所有输入和输出存储在 InOut 符号中。 Out 也别名为%,其中% 是前一个输出,%% 是倒数第二个,以此类推。%123 相当于Out[123]

如果您没有使用% 的习惯,或者仅将其使用到几层深度,请将$HistoryLength 设置为 0 或一个小的正整数,以仅保留最后几个(或没有)输出在Out.

您可能还想查看函数MaxMemoryUsedMemoryInUse

当然,$HistoryLength 问题可能是也可能不是您的问题,但您还没有分享您的实际评估。 如果您能够发布它,也许有人能够更清楚地说明为什么它如此占用内存。

【讨论】:

    【解决方案2】:

    Michael Pilat 的answer 是一个不错的工具,MemoryInUseMaxMemoryUsed 可能是您拥有的最好的工具。 ByteCount 很少有那么大的帮助,因为它测量的结果可能会被高估,因为它忽略了共享子表达式,并且它经常忽略不能通过 Mathematica 函数直接访问的内存,这通常是内存使用的主要组成部分。

    在某些情况下您可以做的一件事是使用Share 函数,它会在可能的情况下强制共享子表达式。在某些情况下,这可以为您节省数十甚至数百兆字节。您可以在使用 Share 之前和之后使用 MemoryInUse 来判断它的工作情况。

    此外,一些看似无害的事情可能会导致 Mathematica 使用比您预期更多的内存。机器实数的连续数组(以及机器实数)可以分配为所谓的“打包”数组,与 C 或 Fortran 分配它们的方式非常相似。但是,如果您在一个数组中混合了机器实数和其他结构(包括符号),则所有内容都必须是"boxed",并且该数组变成了一个指针数组,这会增加很多开销。

    【讨论】:

      【解决方案3】:

      一种方法是在内核内存不足时自动重启内核。您可以在从属内核中执行消耗内存的代码,而主内核只获取计算结果并控制内存使用。

      【讨论】:

        【解决方案4】:

        这是我的内存使用分析解决方案:

        myByteCount[symbolName_String] := 
          Replace[ToHeldExpression[symbolName], 
           Hold[x__] :> 
            If[MemberQ[Attributes[x], Protected | ReadProtected], 
             Sequence @@ {}, {ByteCount[
               Through[{OwnValues, DownValues, UpValues, SubValues, 
                  DefaultValues, FormatValues, NValues}[Unevaluated@x, 
                 Sort -> False]]], symbolName}]];
        
        With[{listing = myByteCount /@ Names[]},
         Labeled[Grid[Reverse@Take[Sort[listing], -100], Frame -> True, 
           Alignment -> Left], 
          Column[{Style[
             "ByteCount for symbols without attributes Protected and \
        ReadProtected in all contexts", 16, FontFamily -> "Times"], 
            Style[Row@{"Total: ", Total[listing[[All, 1]]], " bytes for ", 
               Length[listing], " symbols"}, Bold]}, Center, 1.5], Top]]
        

        上面的评估给出了下表:

        【讨论】:

        • 在 7.0.1 上我得到错误:Optional::opdef: The default value for the optional argument BoxForm`pat_:{_,__} contains a pattern. >> 但我也得到输出。你也得到错误吗?
        • @Mr.Wizard 在新的会话中我没有得到它们,但经过一些工作,上面的代码开始产生这些消息。
        猜你喜欢
        • 1970-01-01
        • 2011-06-09
        • 2010-10-07
        • 2015-08-24
        • 2012-03-15
        • 2013-05-30
        相关资源
        最近更新 更多