Estoy intentando ejecutar el siguiente programa, que calcula las raíces de polinomios de grado hasta d con coeficientes solo +1 o -1, y luego lo almacena en archivos.Mathematica quedando sin memoria
d = 20; n = 18000;
f[z_, i_] := Sum[(2 Mod[Floor[(i - 1)/2^k], 2] - 1) z^(d - k), {k, 0, d}];
Aquí f [z, i] da un polinomio en z con signos más o menos Cuenta en binario. Say d = 2, tendríamos
f [z, 1] = -z - z - 1
f [z, 2] = -z - z + 1
f [ z, 3] = -z + z - 1
f [z, 4] = -z + 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}]
Soy consciente leyendo esto probablemente no es demasiado agradable , pero es relativamente corto de todos modos. Hubiera tratado de reducir las partes relevantes, pero aquí realmente no tengo idea de cuál es el problema. Estoy calculando todas las raíces de f [z, i], y luego simplemente las rodeo para que correspondan a un punto en una cuadrícula n por n, y guardo esos datos en varios archivos.
Por alguna razón, el uso de la memoria en Mathematica se arrastra hasta que llena toda la memoria (6 GB en esta máquina); entonces el cálculo continúa extremadamente lento; ¿Por qué es esto?
No estoy seguro de qué es lo que está usando la memoria aquí; mi única conjetura era la secuencia de archivos usados en la memoria, pero ese no es el caso: intenté anexar datos a archivos de 2GB y no había uso de memoria notable para eso . No parece haber ninguna razón para que Mathematica esté usando grandes cantidades de memoria aquí.
Para valores pequeños de d (15 por ejemplo), el comportamiento es el siguiente: Tengo 4 núcleos en ejecución. Como todos corren a través del bucle ParallelDo (cada uno haciendo un valor de j a la vez), el uso de la memoria aumenta, hasta que todos terminan de atravesar ese bucle una vez. Luego, las próximas veces que pasan por ese ciclo, el uso de la memoria no aumenta en absoluto. El cálculo finalmente termina y todo está bien.
También, lo que es más importante, una vez que se detiene el cálculo, el uso de la memoria no baja. Si empiezo otro cálculo, sucede lo siguiente:
-Si el cálculo anterior se detuvo cuando el uso de la memoria aún aumentaba, continúa aumentando (puede llevar un tiempo volver a aumentar, básicamente para llegar al mismo punto en el cálculo).
-Si el cálculo anterior se detuvo cuando el uso de la memoria no aumentaba, no aumenta más.
Editar: El problema parece provenir de la complejidad relativa de f - cambiarlo a un polinomio más fácil parece solucionar el problema. Pensé que el problema podría ser que Mathematica recuerda f [z, i] para valores específicos de i, pero estableciendo f [z, i]: =. justo después de calcular una raíz de f [z, i] se queja de que la asignación no existía en primer lugar, y la memoria aún se usa.
Realmente es bastante desconcertante, ya que f es lo único que me queda en la memoria, pero definir f en el bucle Do interno y borrarlo cada vez que se calcula una raíz no resuelve el problema.
¿Ha intentado ejecutar este algoritmo con valores d más pequeños o incluso individuales? –
Acabo de agregar un párrafo que describe lo que sucede para los más pequeños d. –
¿Qué sucede cuando ejecuta el programa sin abrir la secuencia, hacer las escrituras y cerrar la secuencia (es decir, sin ninguna E/S)? – Pillsy