在Mathematica中分析内存使用情况

Mog*_*gos 21 profiling memory-management wolfram-mathematica

除了为他们的Eclipse插件(mathematica workbench,iirc)支付$$$之外,有没有办法分析mathkernel内存使用情况(下至个别变量)?

现在我完成了一个占用多GB GB的程序的执行,但是存储的唯一东西最多应该是〜50MB的数据,但是mathkernel.exe往往保持在~1.5GB(基本上,就像Windows一样多给它).有没有更好的方法来解决这个问题,除了保存我需要的数据并每次退出内核?

编辑:我刚刚了解了ByteCount函数(它显示了基本数据类型的一些令人不安的结果,但除此之外),但即使是我所有变量的总和也远不及mathkernel所采用的数量.是什么赋予了?

Mic*_*lat 12

许多用户没有意识到的一件事是,无论是否将输出分配给变量,都需要内存来存储InOut符号中的所有输入和输出.Out也别名为%,其中%是先前的输出,%%是第二到最后一个等%123相当于Out[123].

如果你没有习惯使用%,或者只使用它几个级别,设置$HistoryLength为0或一个小的正整数,只保留最后几个(或没有)输出Out.

您可能还想查看函数MaxMemoryUsedMemoryInUse.

当然,$HistoryLength问题可能与您的问题有关,但您还没有分享您的实际评估.如果你能够发布它,也许有人能够更清楚地知道它为什么如此内存密集.


Ale*_*kov 7

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

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]]
Run Code Online (Sandbox Code Playgroud)

评价以上给出如下表:

截图