O TeX pode gerar "heap dumps" para analisar e otimizar situações de falta de memória?

O TeX pode gerar "heap dumps" para analisar e otimizar situações de falta de memória?

Como autor do pacote pgfplots com muita memória, fui solicitado a analisar algumas situações de falta de memória.

Pude identificar o “culpado”; foi alguma chamada \pdfmdfivesumque finalmente travou.

Estou ciente de algumas soluções para ampliar ou evitar limites de memória, portanto, evite sugestões de como evitar o problema.

Minha motivação aqui é: como engenheiro de software, eu desejava algum tipo de "despejo de pilha" no qual pudesse inspecionar quanta memória está atualmente ocupada por qual "palavra" ou qualquer outra coisa. Esperançosamente, isso poderia permitir otimizações e melhorias sistemáticas; isto é, limpando registos não utilizados ou reestruturando a expansão macro ou qualquer outra coisa.

Você sabe se despejos de heap legíveis por humanos podem ser gerados?


Aqui estão mais algumas dicas sobre o problema que tentei resolver.

Pessoalmente, acho que esta seção não tem mais ou menos relação com a pergunta acima: eu realmente gostaria de ouvir respostas, mesmo que exista uma solução simples para o problema em questão.

De qualquer forma, se você ver como melhorar a situação, eu ouviria com atenção.

O problema em questão era o tamanho da memória principal. Aparentemente, matlab2tikzgerou um arquivo de 300k contendo uma figura pgfplots independente junto com (muitos!) Pontos de dados. E o tikzexternal biblioteca tikz tentou carregar esse arquivo na memória principal para calcular seu hash MD5. Isso falhou. Observe que sem o cálculo MD5, o arquivopoderiaser processado. Na verdade, a biblioteca externa tikz usa \edef\pgfretval{\pdfmdfivesum{\meaning\tikzexternal@temp}}e a chamada \meaningfalha se \tikzexternal@tempcontiver essas 300 mil palavras. Suponho que essas palavras ocorram mais de uma vez na memória principal do TeX; e gostaria de saber onde e por quê. É aqui que eu esperava ver um despejo de pilha.

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

Responder1

O mecanismo principal do TeX não usa memória alocada dinamicamente, mas pools de memória pré-alocados. Portanto, não há nada como uma pilha para ser descartada.

O código base do TeX não fornece uma maneira de mostrar o conteúdo e os ponteiros nos conjuntos de memória pré-alocados. Portanto, a resposta à sua pergunta é: Não, é impossível gerar um heap dump "útil" do TeX (que deveria ser chamado de dump do pool de memória). Com o LuaTeX isso pode ser possível, pois ele não usa o código base do TeX, mas sim um mecanismo reescrito.

Para estender a memória do TeX você pode editar/personalizar o arquivo de configuração texmf.cnfe regenerar seus formatos nas tex -inietapas de instalação do TeX. É por isso que um assistente é necessário aqui. Mas na maioria das vezes é melhor repensar a tokenização do seu código TeX.

informação relacionada