Mathematica geht der Speicher aus

Ich versuche, das folgende Programm auszuführen, das Wurzeln von Polynomen mit einem Grad bis zu d mit Koeffizienten von nur +1 oder -1 berechnet und dann in Dateien speichert.

d = 20; n = 18000; 
f[z_, i_] := Sum[(2 Mod[Floor[(i - 1)/2^k], 2] - 1) z^(d - k), {k, 0, d}];

Hier gibt f [z, i] ein Polynom in z mit Plus- oder Minuszeichen in Binärzahl an. Sagen Sie d = 2, wir hätten

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}]

Mir ist klar, dass das Lesen wahrscheinlich nicht besonders unterhaltsam ist, aber es ist trotzdem relativ kurz. Ich hätte versucht, auf die relevanten Teile zu reduzieren, aber hier habe ich wirklich keine Ahnung, was das Problem ist. Ich berechne alle Wurzeln von f [z, i] und runde sie dann einfach so, dass sie einem Punkt in einem nx n-Raster entsprechen, und speichere diese Daten in verschiedenen Dateien.

Aus irgendeinem Grund steigt die Speichernutzung in Mathematica so lange an, bis der gesamte Speicher belegt ist (6 GB auf diesem Computer). dann geht die Berechnung extrem langsam weiter; warum ist das?

Ich bin mir nicht sicher, wie viel Speicherplatz hier belegt ist - meine einzige Vermutung war der Datenstrom, der den Speicher belegt hat, aber das ist nicht der Fall: Ich habe versucht, Daten an 2-GB-Dateien anzuhängen, und es gab keine merkliche Speichernutzung dafür. Es scheint absolut keinen Grund für Mathematica zu geben, hier große Mengen an Speicher zu verwenden.

Für kleine Werte von d (z. B. 15) ist das Verhalten wie folgt: Ich habe 4 laufende Kernel. Während sie alle die ParallelDo-Schleife durchlaufen (jeweils mit einem Wert von j), steigt die Speichernutzung, bis alle diese Schleife einmal durchlaufen haben. Wenn sie dann das nächste Mal diese Schleife durchlaufen, nimmt die Speichernutzung überhaupt nicht zu. Die Berechnung endet schließlich und alles ist in Ordnung.

Ganz wichtig ist auch, dass nach dem Stoppen der Berechnung die Speichernutzung nicht zurückgeht. Wenn ich eine andere Berechnung starte, passiert Folgendes:

-Wenn die vorherige Berechnung angehalten wurde, als die Speichernutzung noch zunahm, steigt sie weiter an (es kann eine Weile dauern, bis sie wieder zunimmt, um im Grunde den gleichen Punkt in der Berechnung zu erreichen).

-Wenn die vorherige Berechnung angehalten wurde, als die Speichernutzung nicht anstieg, steigt sie nicht weiter an.

Bearbeiten: Das Problem scheint von der relativen Komplexität von f zu herrühren - die Umwandlung in ein einfacheres Polynom scheint das Problem zu beheben. Ich dachte, das Problem könnte sein, dass Mathematica sich f [z, i] für bestimmte Werte von i merkt, aber f [z, i]: = setzt. Unmittelbar nach der Berechnung einer Wurzel von f [z] beklagt sich i], dass die Zuweisung überhaupt nicht existiert und der Speicher weiterhin verwendet wird.

Es ist wirklich ziemlich rätselhaft, da ich mir nur noch vorstellen kann, f zu belegen, aber die Definition von f in der inneren Do-Schleife und das Löschen jedes Mal, nachdem eine Wurzel berechnet wurde, löst das Problem nicht.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage