正如我之前的问题TeX 容量超出(保存大小).txt
,我正在生成一个相当大的、.tex
和文件的索引.pdf
。这个过程已经运行了很长时间,索引的大小不是问题。我添加了逻辑以在索引中插入其他链接,现在即将超出限制string characters
:
Here is how much of TeX's memory you used:
134371 strings out of 493308
9799992 string characters out of 9887816
4157963 words of memory out of 5000000
59945 multiletter control sequences out of 15000+600000
167812 words of font info for 205 fonts, out of 8000000 for 9000
959 hyphenation exceptions out of 8191
87i,12n,83p,10548b,16447s stack positions out of 5000i,500n,10000p,200000b,80000s
在过去的几个月里,我已经多次超出这个范围,并优化了我的大部分代码,但对于进一步优化的地方却没有什么想法了。所以,我试图在我再次陷入困境之前解决这个问题,这似乎迫在眉睫。
作为基准,处理单身的文件结果为:
Here is how much of TeX's memory you used:
52846 strings out of 493308
1137494 string characters out of 9887816
1523413 words of memory out of 5000000
54776 multiletter control sequences out of 15000+600000
167812 words of font info for 205 fonts, out of 8000000 for 9000
959 hyphenation exceptions out of 8191
87i,11n,83p,10548b,1042s stack positions out of 5000i,500n,10000p,200000b,80000s
笔记:
有时
string characters
会无缘无故地略微减少。由于我的索引正在处理文件列表,我看不出向此列表添加另一个文件如何可能减少string characters
所需的数量,但我见过这种情况发生。我已经增加
pool_size
了/usr/local/texlive/2013/texmf.cnf
:pool_size=10000000
抱歉没有提供 MWE。此过程访问我的文件系统,若要复制它,则需要设置一堆文件。
问题:
- 什么是
string characters
? - 应避免使用哪种构造,以及应优先使用哪种构造以尽量减少使用
string characters
? - 有没有办法让我
string characters
在运行过程中看到使用的数量。如果我能得到这份报告前和后通过宏调用,我可能会缩小主要罪魁祸首的范围。 - 增加此限制需要做什么很多更远?
问题 4 的解决方案将是理想的。我不介意花更长时间。目前大约需要 40 分钟来生成 600 页的索引,但即使是一夜之间解决也是可以接受的,因此在运行时间方面还有很大空间。
参考:
答案1
这是池大小:主要是命令名称中使用的字母。通常,您可以在 texmf.cnf 中增加它(除非您达到编译器限制)
% Max number of characters in all strings, including all error messages,
% help texts, font names, control sequences. These values apply to TeX.
pool_size = 6250000
一个简单的测试文件(纯 pdftex)
\tracingstats1
aaa
\def\a{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
\def\b{\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a}
\count0=0
\loop
\advance\count0 1
\expandafter\def\csname \b \romannumeral\count0 \endcsname{}
\iftrue\repeat
这将不断创建新的 csname,直到填满池子,但似乎我可以在 texmf.cnf 中继续推动它
有效资金池似乎增加到
pool_size = 100000000
产生的错误
! TeX capacity exceeded, sorry [pool size=39921916].
39921697 string characters out of 39921916
如果我尝试在 texmf.cnf 中进一步增加它,我不会收到任何警告,但报告的大小不会改变。但这大约是您报告的值的 4 倍。