Ich scheine oft auf Kapazitätsprobleme zu stoßen und habe jedes Mal die Grenzen erhöht. Es gibt mehrere Fragen auf dieser Site dazu. Es scheint jedoch einige widersprüchliche Informationen zu geben und keinen einzigen Ort, an demalleDiese Grenzen sind detailliert beschrieben.
Hauptfrage:
Was ich also suche, ist
- Name der Variable
- Standardwert.
- AbsolutMaximum, auf das es eingestellt werden kann.
- Welche Schritte kann ich unternehmen, um diese Nutzungen zu minimieren? Was sind die DOs und DONTs für jede dieser Kapazitätsgrenzen?
Die mir bekannten Einstellungen sind diejenigen, die am Ende der Protokolldatei aufgeführt sind:
106477 strings out of 493042
2524840 string characters out of 39884661
12363848 words of memory out of 12435455
103471 multiletter control sequences out of 15000+600000
197845 words of font info for 228 fonts, out of 8000000 for 9000
1143 hyphenation exceptions out of 8191
86i,17n,86p,10523b,3398s stack positions out of 5000i,500n,10000p,200000b,80000s
aber es kann noch andere geben, die hier nicht aufgeführt sind. Mein unmittelbares Problem ist, dass words of memory
die obigen Zahlen aus dem ersten Durchlauf meiner Indizierung stammen. Wenn ich versuche, einen zweiten Durchlauf durchzuführen, erhalte ich TeX Capacity Exceeded
.
Beispiele vonAndereVariablen:
Aus den Kommentaren von Davis Carlisle geht hervor, dass auch extra_mem_top
und extra_mem_bot
verwendet werden können. Aber sind damit größere möglich words of memory
oder hängen diese mit einer der anderen Kapazitätsgrenzen im Bericht zusammen? Nochmals: Auf welchen Höchstwert kann ich diese einstellen?
Mögliche DOs und DONTs:
Einige meiner Fragen zur Minimierung der Nutzung sind hier aufgeführt. Vielleicht können diese in den DOs und DONTs für jede der Variablen behandelt werden.
\def\foo{xxx}
Ist es besser , anstelle von zu verwenden\newcommand*{\foo}{xxx}
? Ich kann die Prüfung auf doppelte Makronamen außerhalb von TeX durchführen.Erhöhen Makronamen mit einer großen Anzahl von Zeichen die Verwendung einiger dieser Elemente?
Beispielsweise
\expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx}
gibt es Probleme mit der Kapazität. Wäre es für mich besser,dir1/dir1/long-file-name
eine kürzere Zeichenfolge zuzuordnen, umZXyw
diese Grenzen zu umgehen? Ja, die Lesbarkeit geht verloren, aber ich kann diesen Ersatz automatisieren.Führt wiederholter Text zu einer vermehrten Auslastung der Grenzwerte? Was davon wäre besser:
\MyMacro{../../../../dirA/dirB/dirC/dirD/file0001.tex} \MyMacro{../../../../dirA/dirB/dirC/dirD/file0002.tex} ... \MyMacro{../../../../dirA/dirB/dirC/dirD/file5000.tex}
oder
\def\Path{../../../../dirA/dirB/dirC/dirD/} \MyMacro{\Path/file0001.tex} \MyMacro{\Path/file0002.tex} ... \MyMacro{\Path/file5000.tex}
Hilft
\undef
das Einbinden von Makros, nachdem sie nicht mehr benötigt werden, bei der Einhaltung dieser Beschränkungen?
Natürlich kann ich mit den Dingen, die mir eingefallen sind, experimentieren, aber vielleicht kann man auch noch andere Dinge tun, um die Verwendung dieser begrenzten Zeichenfolgen und Wörter einzuschränken.
Beispiel für Inkonsistenz
In meinem
/usr/local/texlive/2015/texmf.cnf
habe ichmain_memory = 12435455
(12,4M), das ist das angegebene Maximum gemäßLatex gibt mir den Fehler: Autsch --- meine internen Konstanten wurden überschrieben. Wenn ich versuche, es nur um 1 zu erhöhen,12435456
bekomme ich tatsächlichOuch---my internal constants have been clobbered!---case 14
. Selbst nach der Ausführungsudo vi texmf.cnf
gemäßErhöhen Sie die LaTeX-Kapazität.Doch Thomas F. Sturms Lösung fürWie kann man die „Hauptspeichergröße“ von TeX erweitern? (pgfplots-Speicherüberlastung)zeigt an
100571134 words of memory out of 103000000
Dies zeigt an, dass das Maximum mindestens 103 M beträgt.
/usr/local/texlive/2015/texmf-dist/web2c/texmf.cnf
Darüber hinaus gibt es in der Datei einen Kommentar, derMemory. Must be less than 8,000,000 total.
besagt: Nun, das ist offensichtlich falsch, da ich mehr als das verwenden kann.
Anmerkungen:
Ich gehe davon aus, dass alle Änderungen an der Datei vorgenommen werden, die
kpsewhich texmf.cnf
gemäß Leo Lius Antwort unterWie kann man die „Hauptspeichergröße“ von TeX erweitern? (pgfplots-Speicherüberlastung), was in meinem Fall ist/usr/local/texlive/2015/texmf.cnf
Wenn es verschiedene Möglichkeiten gibt, einige davon einzustellen, würde ich diese auch gerne wissen.
- Mein Hauptproblem besteht derzeit darin, eine große Anzahl von Einträgen zu indizieren und das
words of memory
Limit zu erreichen. Mich beunruhigt weniger die Laufzeit (im Rahmen des Zumutbaren), sondern mehr das Überschreiten dieser Limits. - Ich verwende TeXLive2015, falls das wichtig ist. Aber wenn die Grenzen von der Distribution abhängen, wäre es auch gut, das zu wissen.
- In dieser Frage geht es nicht um Fehlerzustände, die zu einer Überschreitung der Kapazitätsgrenzen führen (wie meine naive FrageTex-Kapazität überschritten (wenn % nach Verwendung des Makros entfernt wird)).
Verweise:
- Gibt es Beschränkungen für die Anzahl neuer Makros oder Befehle in TeX/LaTeX?listet die hier genannten Variablen auf und stellt einen Testfall bereit. Dabei geht es jedoch speziell um die Beschränkungen, die auf der Anzahl der Makros beruhen.
- Komponenten der Speichernutzung von (La)TeXist eine ausgezeichnete Referenz, also können diese Antworten vielleicht stattdessen dort hinzugefügt und dies als Duplikat geschlossen werden?
Antwort1
Ist es besser, \def\foo{xxx} statt \newcommand*{\foo}{xxx} zu verwenden? Ich kann die Prüfung auf doppelte Makronamen auch außerhalb von TeX durchführen.
Nein, kommt aufs Gleiche raus
Gibt es beispielsweise bei \expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx} irgendwelche Probleme hinsichtlich der Kapazität?
theoretisch ja, der csname muss irgendwo gespeichert werden, daher werden hierdurch 2524840 von 39884661 Zeichenketten verbraucht
aber Sie werden es vermutlich nur um etwa 20 Zeichen verkürzen, also wird es keinen großen Unterschied machen, 39884661
Was von Folgendem wäre besser:
wieder marginal verwendet der erste mehr, da er einen weiteren csname ( \path
) definiert, der einen aus
103471 multiletter control sequences out of 15000+600000
aber Sie sind noch lange nicht an dieser Grenze
Hilft es bei der Beseitigung dieser Beschränkungen, Makros mit \Undefing zu entfernen, wenn sie nicht mehr benötigt werden?
ja, deshalb entfernt Latex viele Befehle, wobei \begin{document}
der Hash-Eintrag nicht zurückgefordert wird (Anzahl der Befehle mit mehreren Buchstaben), aber der Hauptspeicher, der zum Speichern der Definition verwendet wurde, wird zurückgefordert.
Antwort2
Vor vielen Jahren habe ich einen Vortrag über das Problem der „TeX-Kapazitätsüberschreitung“ gehalten und dabei einige Hintergrundinformationen, Grundursachen und Möglichkeiten zu ihrer Vermeidung gegeben.
Der erste Teil des Vortrags wurde veröffentlicht in„Die TeXnische Komödie“ Heft 1995/3, Seiten 22ff.
Auf Seite 24 finden Sie eine Tabelle mit allen (Standard-TeX.web-)Überlauffehlermeldungen, den zugehörigen TeX.web-Parametern und den Parametereinstellungen.
Negativ: (1) der Vortrag und das Papier sind nur auf Deutsch, (2) ich hatte nie genug Zeit, die Artikelserie einschließlich aller verbleibenden Themen in einem 2. und 3. Teil fertigzustellen, und (3) sie basiert auf Standard-TeX.web bzw. der Web2C-Version „bigTeX“, ohne e-TeX, pdfTeX, XeTeX, LuaTeX und ähnliche erweiterte Varianten.