Matematyka kończy się w pamięci

Usiłuję uruchomić następujący program, który oblicza pierwiastki wielomianów stopnia do d ze współczynnikami tylko +1 lub -1, a następnie zapisz go w plikach.

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

Tutaj f [z, i] daje wielomian z z znakami plus lub minus liczonymi w binarnie. Powiedzmy, że 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}]

Zdaję sobie sprawę, że czytanie tego prawdopodobnie nie jest zbyt przyjemne, ale i tak jest stosunkowo krótkie. Chciałbym ograniczyć się do odpowiednich części, ale tutaj naprawdę nie mam pojęcia, czym jest problem. Obliczam wszystkie pierwiastki f [z, i], a następnie po prostu zaokrąglaj je, aby odpowiadały punktowi w siatce n na n i zapisują te dane w różnych plikach.

Z jakiegoś powodu użycie pamięci w Mathematica wkrada się aż do zapełnienia całej pamięci (6 GB na tym komputerze); następnie obliczenia trwają bardzo powoli; dlaczego to?

Nie jestem pewien, co tutaj wykorzystuje pamięć - zgaduję tylko, że strumień plików wyczerpał pamięć, ale tak nie jest: próbowałem dołączać dane do plików 2 GB i nie było na to żadnego zauważalnego wykorzystania pamięci. Wydaje się, że absolutnie nie ma powodu, by Mathematica korzystała z dużej ilości pamięci.

Dla małych wartości d (na przykład 15) zachowanie jest następujące: Mam uruchomione 4 jądra. Ponieważ wszystkie przechodzą przez pętlę ParallelDo (każda wykonuje wartość j na raz), wykorzystanie pamięci wzrasta, aż wszystkie zakończą przechodzenie przez tę pętlę jeden raz. Następnie następnym razem, gdy przejdą przez tę pętlę, użycie pamięci w ogóle się nie zwiększy. Obliczenia ostatecznie się kończą i wszystko jest w porządku.

Co równie ważne, po zakończeniu obliczeń zużycie pamięci nie zmniejsza się. Jeśli zacznę kolejne obliczenia, dzieje się tak:

-Jeżeli poprzednie obliczenia zatrzymały się, gdy zużycie pamięci wciąż wzrastało, nadal rośnie (ponowne rozpoczęcie zwiększania może potrwać chwilę, zasadniczo w celu uzyskania tego samego punktu w obliczeniach).

-Jeżeli poprzednie obliczenie zostało zatrzymane, gdy zużycie pamięci nie wzrastało, nie wzrasta dalej.

Edytować: Wydaje się, że problem pochodzi ze względnej złożoności f - zmiany go na łatwiejszy wielomian wydaje się rozwiązywać problem. Myślałem, że problem może polegać na tym, że Mathematica zapamiętuje f [z, i] dla określonych wartości i, ale ustawienie f [z, i]: =. tuż po obliczeniu pierwiastka f [z, i] skarży się, że przypisanie nie istniało w pierwszej kolejności, a pamięć jest nadal używana.

Naprawdę zastanawiające jest to, że f jest jedyną pozostałą rzeczą, jaką mogę sobie wyobrazić, zajmując pamięć, ale zdefiniowanie fw wewnętrznej pętli Do i wyczyszczenie jej za każdym razem, gdy obliczany jest root, nie rozwiązuje problemu.

questionAnswers(1)

yourAnswerToTheQuestion