数学运行内存(Mathematica running out of memory)

2019-09-02 00:51发布

我试图运行下面的程序,它计算的程度高达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 A多项式加号或减号二进制计数。 比如D = 2,我们将有

F [I,1] = Z 2 - z - 1
F [I,2] = Z 2 - Z + 1
F [I,3] = -z 2 + Z - 1
F [I,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}]

我知道读这可能不是太不过瘾了,但它是相对较短的反正。 我一直在努力,砍下来的有关部分,但在这里,我真的不知道麻烦是什么。 我计算f所有的根[Z,I],然后刚轮,使它们分别与点在由n个网格,并保存在不同的文件数据。

出于某种原因,在数学的内存使用情况向上蔓延,直到填满所有的记忆(6 GB本机上); 然后计算继续极为缓慢; 为什么是这样?

我不知道什么是这里使用了内存 - 我唯一的猜测是使用了内存中的文件流,但事实并非如此:我试图将数据追加到2GB的文件,并有针对没有明显的内存使用情况。 人们似乎丝毫没有理由在这里使用Mathematica大量的内存。

对于d(15为例)的小值,则行为如下:我有4个内核运行。 因为它们都通过ParallelDo环(每做一次一个j的值)运行,内存使用量的增加,直到他们全部完成通过循环去一次。 然后,他们通过循环进入下一个时代,内存使用并没有增加。 计算最终完成,一切都很好。

此外,相当重要的是,一旦计算停止,内存使用不回去了。 如果我再掀计算,将出现以下情况:

- 如果前面的计算停止时内存的使用仍在增加,继续增加(这可能需要一段时间才能再次开始增加,基本上去在计算同一点)。

- 如果当内存使用并没有增加先前的计算停止,它不会进一步增加。

编辑:这个问题似乎来自f的相对复杂性-它改变成一些更容易多项式似乎解决这个问题。 我想这个问题可能是数学记得F [Z,I]针对我的具体数值,但设置F [Z,I]:=。 刚计算f的根后[Z,I]抱怨说,分配没有在第一位置存在的,并且存储器仍在使用。

这是相当令人费解真的像f是唯一剩下的事情我能想象占用内存,但在定义在内Do循环f和根计算不能解决问题之后,每次清除它。

Answer 1:

哎哟,这是一个讨厌的一个。

这是怎么回事是N会做结果的高速缓存,以便如果再需要他们加速未来计算。 有时,这绝对是你想要的,但有时它只是打破了世界。 幸运的是,你有一些选择。 一种是使用ClearSystemCache命令,它不正是它在锡说。 之后我跑你未并行化循环的一段时间(之前感到厌烦,并中止计算), MemoryInUse报道〜160 MIB使用。 使用ClearSystemCache得到了下降到约14 MIB。

有一件事你应该看看这样做,而不是调用ClearSystemCache编程方式,就是用SetSystemOptions改变缓存行为。 你应该看看SystemOptions["CacheOptions"]看到的可能性是什么。

编辑:这并不令人惊奇的是,缓存导致更复杂的表达式一个更大的问题。 它在什么地方藏起来这些表达式的副本,以及更复杂的表达式需要更多的内存。



文章来源: Mathematica running out of memory