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点附近有曲线突破?
斜率变化的点是否定的.8192.这等于2 ^ 13,这是表指数中最快的上限i.当mma到达此点时,它已计算出所有可能的f[z, i]值.由于此调用独立于j,j(2)的下一个值将f[z, 1], ..., f[z, 8192]再次生成相同的范围().我认为这是内部缓存启动的地方,需要更少的额外内存.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |