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

Ale*_*kov 3 memory-management wolfram-mathematica

这个问题的灵感来自Mathematica中由于中间计算结果的内部缓存而导致的内存泄漏问题.所有这些都没有记录,但对于运行内存密集型计算的任何人来说都很重要.

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

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

新的内核会话中,我的机器上的输出(Mathematica 7.0.1 for Windows)总是如下:

截图

任何人都可以解释为什么在8400点附近有曲线突破?

Sjo*_*ies 7

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