SystemCache和MemoryInUse - 任何人都可以解释这种行为吗?

时间:2011-07-24 15:18:09

标签: memory-management wolfram-mathematica

这个问题的灵感来自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]

新鲜内核会话中,我的计算机上的输出( Mathematica 7.0.1 for Windows)始终如下:

screenshot

有人可以解释为什么在点数8400附近有曲线中断?

1 个答案:

答案 0 :(得分:7)

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