Kann TeX „Heap Dumps“ generieren, um Speichermangelsituationen zu analysieren und zu optimieren?

Kann TeX „Heap Dumps“ generieren, um Speichermangelsituationen zu analysieren und zu optimieren?

Als Paketautor des speicherintensiven Pakets pgfplots wurde ich gebeten, einige Speichermangelsituationen zu analysieren.

Den „Übeltäter“ konnte ich identifizieren, es war ein Telefonat, \pdfmdfivesumbei dem es dann endgültig abstürzte.

Mir sind einige Lösungen bekannt, wie man Speicherbeschränkungen vergrößern oder vermeiden kann. Bitte sehen Sie von Vorschlägen zur Vermeidung des Problems ab.

Meine Motivation dabei ist: Als Softwareentwickler wünschte ich mir eine Art „Heap Dump“, in dem ich prüfen kann, wie viel Speicher gerade von welchem ​​„Wort“ oder was auch immer belegt wird. Dies könnte hoffentlich Optimierungen und systematische Verbesserungen ermöglichen; etwa durch das Löschen nicht verwendeter Register oder durch die Umstrukturierung der Makroerweiterung oder was auch immer.

Wissen Sie, ob für Menschen lesbare Heapdumps generiert werden können?


Hier erhalten Sie weitere Einblicke in das Problem, das ich zu lösen versuchte.

Persönlich denke ich, dass dieser Abschnitt mehr oder weniger nichts mit der obigen Frage zu tun hat: Ich würde wirklich gerne Antworten hören, auch wenn es für das vorliegende Problem eine einfache Lösung gibt.

Wie dem auch sei, wenn Sie eine Möglichkeit sehen, die Situation zu verbessern, würde ich Ihnen aufmerksam zuhören.

Das Problem war die Größe des Hauptspeichers. Anscheinend matlab2tikzwurde eine 300 KB große Datei generiert, die eine in sich geschlossene pgfplots-Abbildung zusammen mit (vielen!) Datenpunkten enthielt. Und die Tikz- externalBibliothek versuchte, diese Datei in den Hauptspeicher zu laden, um ihren MD5-Hash zu berechnen. Dies schlug fehl. Beachten Sie, dass ohne die MD5-Berechnung die Dateikönnteverarbeitet werden. Tatsächlich verwendet die externe Tikz-Bibliothek diese 300.000 Wörter \edef\pgfretval{\pdfmdfivesum{\meaning\tikzexternal@temp}}und der Aufruf schlägt \meaningfehl, wenn \tikzexternal@tempsie diese 300.000 Wörter enthält. Ich nehme an, dass diese Wörter mehr als einmal im Hauptspeicher von TeX vorkommen, und ich würde gerne wissen, wo und warum. Hier hoffte ich, einen Heap Dump zu sehen.

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

Antwort1

Die Kern-Engine von TeX verwendet keinen dynamisch zugewiesenen Speicher, sondern vorab zugewiesene Speicherpools. Es gibt also nichts Besseres als einen Heap, der ausgelagert werden kann.

Der TeX-Basiscode bietet keine Möglichkeit, den Inhalt und die Zeiger in den vorab zugewiesenen Speicherpools anzuzeigen. Die Antwort auf Ihre Frage lautet also: Nein, es ist unmöglich, einen „nützlichen“ TeX-Heap-Dump (der eigentlich Memory Pool Dump heißen sollte) zu generieren. Mit LuaTeX könnte dies möglich sein, da es nicht den TeX-Basiscode, sondern eine neu geschriebene Engine verwendet.

Um den TeX-Speicher zu erweitern, können Sie die Konfigurationsdatei bearbeiten/anpassen texmf.cnfund Ihre Formate in den tex -iniSchritten Ihrer TeX-Installation neu generieren. Deshalb wird hier ein Assistent benötigt. Aber in den meisten Fällen ist es besser, die Tokenisierung Ihres TeX-Codes zu überdenken.

verwandte Informationen