我试图运行下面的程序,它计算的程度高达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和根计算不能解决问题之后,每次清除它。