
Als Paketautor des speicherintensiven Pakets pgfplots wurde ich gebeten, einige Speichermangelsituationen zu analysieren.
Den „Übeltäter“ konnte ich identifizieren, es war ein Telefonat, \pdfmdfivesum
bei 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 matlab2tikz
wurde eine 300 KB große Datei generiert, die eine in sich geschlossene pgfplots-Abbildung zusammen mit (vielen!) Datenpunkten enthielt. Und die Tikz- external
Bibliothek 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 \meaning
fehl, wenn \tikzexternal@temp
sie 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.cnf
und Ihre Formate in den tex -ini
Schritten 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.