这个问题的灵感来自the question on memory leaks in Mathematica due to internal caching of results of intermediate computations。所有这些内容都没有记录,但是对于运行内存密集型计算的任何人来说都很重要。

当试图了解内部缓存机制的逻辑时,我发现了一些有趣的东西。考虑以下:

$HistoryLength = 0;
(*dummy command for loading of the Root package*)
Root[# &, 1];
d = 13;
f[z_, i_] := Sum[(2 Mod[Floor[(i - 1)/2^k], 2] - 1) z^(d - k), {k, 0, d}];
(memLog = Flatten[
     Table[Root[f[z, i], j]; {SessionTime[], MemoryInUse[]/1024.^2}, {j, 1,
       d}, {i, 1, 2^d}], 1];) // Timing
pl1 = ListLinePlot[memLog,
  FrameLabel -> {"SessionTime, sec", "MemoryInUse, Mb"}, PlotRange -> All,
  Frame -> True, Axes -> False]
pl2 = ListLinePlot[memLog[[All, 2]],
  FrameLabel -> {"Point", "MemoryInUse, Mb"}, PlotRange -> All, Frame -> True,
   Axes -> False]


在新的内核会话中,我的机器(对于Windows为Mathematica 7.0.1)上的输出始终如下:



谁能解释为什么在8400点附近出现曲线折断?

最佳答案

斜率发生变化的点为否。 8192。这等于2 ^ 13,这是最快的表索引i的上限。当mma到达这一点时,它已经计算了所有可能的f[z, i]值。由于此调用独立于j,因此j的下一个值(2)将再次生成相同的范围(f[z, 1], ..., f[z, 8192])。我认为这是内部缓存开始的地方,并且需要更少的额外内存。

08-07 12:36