我正在尝试运行以下程序,该程序计算最多 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] = -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}]
我意识到阅读这篇文章可能不太有趣,但无论如何它相对较短。我会尝试减少相关部分,但在这里我真的不知道问题出在哪里。我正在计算 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 并在每次计算根后清除它并不能解决问题。