这个问题的灵感来自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)始终如下:
有人可以解释为什么在点数8400附近有曲线中断?
答案 0 :(得分:7)
斜率变化的点是否定的。 8192.这等于2 ^ 13,这是表格索引i
中最快的上限。当mma到达此时,它已计算出所有可能的f[z, i]
值。由于此调用与j
无关,因此j
(2)的下一个值将再次生成相同的范围(f[z, 1], ..., f[z, 8192]
)。我认为这是内部缓存启动的地方,需要更少的额外内存。