
Como autor del paquete pgfplots con uso intensivo de memoria, se me ha pedido que analice alguna situación de falta de memoria.
Pude identificar al "culpable"; Fue una llamada a \pdfmdfivesum
la que finalmente se estrelló.
Conozco algunas soluciones para ampliar o evitar los límites de memoria, así que evite sugerencias sobre cómo evitar el problema.
Mi motivación aquí es: como ingeniero de software, deseaba algún tipo de "volcado de montón" en el que pudiera inspeccionar cuánta memoria está ocupada actualmente por qué "palabra" o lo que sea. Es de esperar que esto permita optimizaciones y mejoras sistemáticas; es decir, limpiando los registros no utilizados o reestructurando la expansión macro o lo que sea.
¿Sabe si se pueden generar volcados de montón legibles por humanos?
Aquí hay más información sobre el problema que intenté abordar.
Personalmente, creo que esta sección no tiene más o menos relación con la pregunta anterior: realmente me gustaría escuchar respuestas incluso si hay una solución simple al problema en cuestión.
De todos modos, si veis cómo mejorar la situación, os escucharía atentamente.
El problema en cuestión era el tamaño de la memoria principal. Aparentemente, matlab2tikz
generó un archivo de 300k que contiene una figura de pgfplots independiente junto con (¡muchos!) puntos de datos. Y la external
biblioteca tikz intentó cargar ese archivo en la memoria principal para calcular su hash MD5. Esto falló. Tenga en cuenta que sin el cálculo MD5, el archivopodríaestar procesado. De hecho, la biblioteca externa de tikz utiliza \edef\pgfretval{\pdfmdfivesum{\meaning\tikzexternal@temp}}
y la llamada \meaning
falla si \tikzexternal@temp
contiene estas 300k palabras. Supongo que estas palabras aparecen más de una vez en la memoria principal de TeX; y me gustaría saber dónde y por qué. Aquí es donde esperaba ver un volcado del montón.
Runaway definition?
->
! TeX capacity exceeded, sorry [main memory size=3000000].
\tikzexternal@hashfct ...aning \tikzexternal@temp
}
l.105 \end{tikzpicture}
%
If you really absolutely need more capacity,
you can ask a wizard to enlarge me.
Here is how much of TeX's memory you used:
18462 strings out of 494578
804304 string characters out of 3169744
3000001 words of memory out of 3000000
21352 multiletter control sequences out of 15000+200000
Respuesta1
El motor central de TeX no utiliza memoria asignada dinámicamente sino grupos de memoria preasignados. Así que no hay nada como deshacerse de un montón.
El código base de TeX no proporciona una manera de mostrar los contenidos y punteros en los grupos de memoria preasignados. Entonces, la respuesta a su pregunta es: No, es imposible generar un volcado de montón TeX "útil" (que debería llamarse volcado de grupo de memoria). Con LuaTeX podría ser posible, ya que no utiliza el código base de TeX sino un motor reescrito.
Para ampliar la memoria TeX, puede editar/personalizar el archivo de configuración texmf.cnf
y regenerar sus formatos en los tex -ini
pasos de su instalación TeX. Por eso se necesita un asistente aquí. Pero la mayoría de las veces es mejor repensar la tokenización de su código TeX.