Sam*_*ire 18 memory-leaks memory-management wolfram-mathematica
我正在尝试运行以下程序,该程序计算度数达到d的多项式的根,系数仅为+1或-1,然后将其存储到文件中.
d = 20; n = 18000;
f[z_, i_] := Sum[(2 Mod[Floor[(i - 1)/2^k], 2] - 1) z^(d - k), {k, 0, d}];
Run Code Online (Sandbox Code Playgroud)
这里f [z,i]给出z中的多项式,其中加号或减号以二进制计数.说d = 2,我们会的
f [z,1] = -z 2 - z - 1
f [z,2] = -z 2 - z + 1
f [z,3] = -z 2 + z - 1
f [z,4] = - z 2 + z + 1
DistributeDefinitions[d, n, f]
ParallelDo[
Do[
root = N[Root[f[z, i], j]];
{a, b} = Round[n ({Re[root], Im[root]}/1.5 + 1)/2];
{i, 1, 2^d}],
{j, 1, d}]
Run Code Online (Sandbox Code Playgroud)
我意识到阅读这可能不太令人愉快,但无论如何它都相对较短.我会尝试减少相关部分,但在这里我真的不知道问题是什么.我正在计算f [z,i]的所有根,然后将它们四舍五入以使它们对应于n个网格中的点,并将该数据保存在各种文件中.
出于某种原因,Mathematica中的内存使用量会逐渐增加,直到它填满所有内存(此机器上为6 GB); 然后计算继续非常缓慢; 为什么是这样?
我不确定这里的内存消耗是多少 - 我唯一的猜测就是内存消耗的文件流,但事实并非如此:我尝试将数据附加到2GB文件中,并没有明显的内存使用情况.似乎Mathematica绝对没有理由在这里使用大量内存.
对于d的小值(例如15),行为如下:我有4个内核在运行.当它们都通过ParallelDo循环(每次都执行j值)时,内存使用会增加,直到它们都完成一次循环.然后,下次他们经历该循环时,内存使用根本不会增加.计算最终完成,一切都很好.
此外,非常重要的是,一旦计算停止,内存使用不会再次下降.如果我开始另一个计算,会发生以下情况:
- 如果先前的计算在内存使用仍在增加时停止,则会继续增加(可能需要一段时间才能再次开始增加,基本上是为了达到计算中的相同点).
- 如果先前的计算在内存使用不增加时停止,则不会进一步增加.
编辑:问题似乎来自f的相对复杂性 - 将其更改为更简单的多项式似乎可以解决问题.我认为问题可能是Mathematica记住f [z,i]的特定值i,但设置f [z,i]:=.在计算了f [z,i]的根之后,抱怨首先不存在赋值,并且仍然使用了内存.
这真是令人费解,因为f是我能想象的唯一剩余的东西占用内存,但是在内部Do循环中定义f并且每次在计算根之后清除它都无法解决问题.
Pil*_*lsy 11
哎呀,这是一个令人讨厌的问题.
正在发生的事情是,N如果您再次需要,将会对结果进行缓存,以加快未来的计算速度.有时这绝对是你想要的,但有时它只是打破了世界.幸运的是,你确实有一些选择.一种是使用ClearSystemCache命令,它就像它在锡上说的那样.在我运行你的非并行化循环一段时间之后(在厌倦并中止计算之前),MemoryInUse报告使用了~160 MiB.使用ClearSystemCache得到了大约14 MiB.
您应该看一下,而不是以ClearSystemCache编程方式调用,SetSystemOptions用于更改缓存行为.您应该SystemOptions["CacheOptions"]看一下可能性是什么.
编辑:对于更复杂的表达式而言,缓存会导致更大的问题,这并不奇怪.它必须在某处隐藏这些表达式的副本,而更复杂的表达式需要更多内存.