内存管理 – 数学内存不足

我正在尝试运行以下程序,该程序根据公式的多项式计算d到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}];

这里f [z,i]给出一个带有加号或减号的z中的多项式,以二进制计数。说d = 2,我们会有

f [z,1] = -z2-z-1
f [z,2] = -z2-z 1
f [z,3] = -z2 z-1
f [z,4] = -z2 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}]

我认识到阅读这可能不是太愉快,但反而相对较短。我会试图削减相关部分,但是我真的不知道麻烦是什么。我正在计算f [z,i]的所有根,然后围绕它们使它们对应于n乘n格的点,并将该数据保存在各种文件中。

由于某些原因,Mathematica的内存使用量会累积,直到它填满所有内存(本机上为6 GB);那么计算继续非常缓慢;为什么是这样?

我不知道在这里使用内存是什么 – 我唯一的猜测是文件流用尽了内存,但事实并非如此:我尝试将数据附加到2GB文件,并没有明显的内存使用。 Mathematica似乎绝对没有理由在这里使用大量的内存。

对于小值d(例如15),行为如下:我有4个内核运行。当它们都通过ParallelDo循环(每次都执行一次j值时),内存使用增加,直到它们都完成了一次循环。那么下一次他们经过这个循环,内存使用根本不会增加。计算最终结束,一切都很好。

此外,相当重要的是,一旦计算停止,内存使用不会退回。
如果我开始另一个计算,则会发生以下情况:

– 如果以前的计算在内存使用量仍然增加时停止,它会继续增加(可能需要一段时间才能开始增加,基本上可以在计算中达到同一点)。

– 如果以前的计算在内存使用不增加时停止,则不会进一步增加。

编辑:这个问题似乎来自f的相对复杂性 – 将其改成一些更简单的多项式似乎解决了这个问题。我认为这个问题可能是数学家记得f [z,i]具体的i值,但设置f [z,i]:=。在计算f [z,i]的根之后,只是抱怨分配首先不存在,并且内存仍然被使用。

这真的很令人费解,因为f是唯一剩下的东西,我可以想象占用内存,但是在内部Do循环中定义f,并且每次计算根后都清除它并不能解决问题。

哦,这是一个讨厌的。

发生的是N将缓存结果,以便加快未来的计算,如果您再次需要它们。有时这绝对是你想要的,但有时它只是打破了世界。幸运的是,你有一些选择。一个是使用ClearSystemCache命令,它只是在锡上说的。在我运行你的非并行化循环一段时间之后(在无聊和中止计算之前),MemoryInUse报告〜160 MiB在使用中。使用ClearSystemCache得到了大约14 MiB。

你应该看看做的一件事,而不是以编程方式调用ClearSystemCache,是使用SetSystemOptions来改变缓存行为。您应该看看SystemOptions [“CacheOptions”],看看可能性是什么。

编辑:对于更复杂的表达式,缓存会导致更大的问题,这并不奇怪。它必须是这些表达式的副本,而更复杂的表达式需要更多的内存。

翻译自:https://stackoverflow.com/questions/1638702/mathematica-running-out-of-memory

转载注明原文:内存管理 – 数学内存不足