¿Puede TeX generar "volcados de montón" para analizar y optimizar situaciones de falta de memoria?

¿Puede TeX generar "volcados de montón" para analizar y optimizar situaciones de falta de memoria?

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 \pdfmdfivesumla 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, matlab2tikzgeneró un archivo de 300k que contiene una figura de pgfplots independiente junto con (¡muchos!) puntos de datos. Y la externalbiblioteca 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 \meaningfalla si \tikzexternal@tempcontiene 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.cnfy regenerar sus formatos en los tex -inipasos 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.

información relacionada