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
许多用户没有意识到的一件事是,无论是否将输出分配给变量,都需要内存来存储In
和Out
符号中的所有输入和输出.Out
也别名为%
,其中%
是先前的输出,%%
是第二到最后一个等%123
相当于Out[123]
.
如果你没有习惯使用%
,或者只使用它几个级别,设置$HistoryLength
为0或一个小的正整数,只保留最后几个(或没有)输出Out
.
您可能还想查看函数MaxMemoryUsed
和MemoryInUse
.
当然,$HistoryLength
问题可能与您的问题有关,但您还没有分享您的实际评估.如果你能够发布它,也许有人能够更清楚地知道它为什么如此内存密集.
这是我的内存使用情况分析解决方案:
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)
评价以上给出如下表: