Memory management SystemCache和MemoryUse-有人能解释这种行为吗?

Memory management SystemCache和MemoryUse-有人能解释这种行为吗?,memory-management,wolfram-mathematica,Memory Management,Wolfram 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

这个问题的灵感来自。所有这些东西都没有文档记录,但对于运行内存密集型计算的任何人来说都很重要

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

$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]
fresh内核会话中,我的机器(Mathematica 7.0.1 for Windows)上的输出始终如下所示:


有人能解释为什么在8400号点附近有曲线断裂吗?

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

我认为,解释一个复杂软件的内存使用行为,而不需要手头上的源代码(有时还需要眼皮底下的源代码),这是oracle的工作。维基百科:神谕被认为是神与人直接对话的门户。@belisarius World and nature在某种意义上也可以被称为“一个没有源代码的复杂软件”,但科学家解释了它的神秘性,并将其秘密用于实际目的。这里的关键词是研究黑匣子的科学方法。自然在某种程度上是合乎逻辑的,而软件……此外,物理学家通常做的是创建模型。你知道,模型不是一种解释,只是一种合理的方法,有助于制定预测。像“为什么在8400点附近有曲线断裂”这样的问题更像是工程而不是科学。要回答这个问题,您必须了解系统的内部结构。下面Sjoerd的优秀答案都是模型,你可以使用它们,直到找到更好的模型。。。