我正在编译一个非常简单的 LaTeX 文件,其中包含几十个pgfplots
。现在,我可以逐个部分地进行编译,但是无法一次性编译所有内容。我确实需要所有这些图(噪声图)具有良好的精度,并希望避免进一步减少图形。当我运行编译时,我收到此错误消息:
[...] TeX capacity exceeded, sorry [main memory size=3000000].
有没有什么办法可以避免出现这个消息?pgfplots
如果在 TeX 不超载的情况下我无法用它绘制几十个图形,我该如何使用呢?请问如何扩展 TeX 内存大小?
答案1
这pgfplots
软件包对 TeX 内存的占用可能特别大,特别是当您创建包含大量数据点的图时。事实上,手册中有一节pgfplots
关于扩展 TeX 内存的内容。然而,这并不意味着扩展 TeX 内存是最好的解决方案。相反,我建议使用“外部化”方法(手册第 7.1 节pgfplots
)。
外部化的想法是将每个图编译为单独的 TeX 作业。这会产生一个可用于主作业的图形。因此,每个图都有自己的内存需求,与所有其他图分开。这通常可以避免需要增加 TeX 的内存。同时,生成的文件可以在 TeX 运行之间保留,这将加快第二次和后续运行的编译速度。最新版本的外部化系统需要您做两件事。首先,您将
\usepgfplotslibrary{external}
\tikzexternalize
在您的前言中,打开系统。其次,您需要启用“shell escape”。这可以在命令行上通过添加开关来完成-shell-escape
:
pdflatex -shell-escape <filename>
在 LaTeX 编辑器中也可以这样做:设置中通常有一个地方可以进行此类操作。我只想补充一点,shell escape 确实存在一些安全隐患:仅用于您信任的文档!
答案2
编译某些文件时,我时不时会遇到同样的问题。当然,每次我都忘记了以前是如何解决的。然后,我用谷歌搜索,找到了这个页面。接下来,我记得我多次访问过这个页面,但不幸的是,这些答案在过去对我遇到的问题没有帮助。为了打破土拨鼠日的怪圈,我写下了这个答案,它可能对我自己(下一个怪圈)有帮助,也希望对其他人有帮助。坏消息是,它只对MikTeX
用户有效(?)。
pdflatex --enable-write18 --extra-mem-bot=10000000 --synctex=1 <filename>
您可以10000000
用另一个高得离谱的数字来替换。
正如@coatless所评论的那样,您可能必须添加--extra-mem-top=10000000
除我的测试示例之外的其他文档类型。 MiKTeX手册包含以下解释:
--extra-mem-bot=n
:为大型数据结构(如框、胶水、断点等)设置额外大小(以内存字为单位)。仅在读取内存转储文件后才相关。--extra-mem-top=n
:设置字符、标记等的额外大小(以内存字为单位)。仅在读取内存转储文件后才相关。
为了说明来自测试文档的一些示例日志条目:
没有额外内存的失败示例:
21229 strings out of 493921
360228 string characters out of 3152094
3000000 words of memory out of 3000000
24030 multiletter control sequences out of 15000+200000
49729 words of font info for 45 fonts, out of 3000000 for 9000
841 hyphenation exceptions out of 8191
工作示例--extra-mem-bot=10000000
:
23652 strings out of 493921
401787 string characters out of 3152094
10571134 words of memory out of 13000000
24308 multiletter control sequences out of 15000+200000
49729 words of font info for 45 fonts, out of 3000000 for 9000
841 hyphenation exceptions out of 8191
工作示例--extra-mem-bot=100000000
:
23652 strings out of 493921
401787 string characters out of 3152094
100571134 words of memory out of 103000000
24308 multiletter control sequences out of 15000+200000
49729 words of font info for 45 fonts, out of 3000000 for 9000
841 hyphenation exceptions out of 8191
我猜我的例子确实需要571134
记忆的词语(其余部分则被用来取乐)。
答案3
根据 AlexG 的评论,内存大小在 TeX Live 的最新版本中一直是一个恒定的大值。看来你不需要扩展它。
在旧版 TeX Live 中,你可以修改/some/path/to/texlive/some/subpath/web2c/texmf.cnf
,可以在终端中输入以下内容找到:
kpsewhich -a texmf.cnf
然后通过包括以下内容来修改内存大小:
main_memory = 3000000
texmf.cnf
(更多详细信息请参阅文件中的注释。)
然后以 root 身份运行以下命令来重新创建格式文件:
fmtutil-sys --all
答案4
在 MikTex 中,可以通过这种方式永久增加内存大小:
1、对于视窗,打开命令窗口并输入:
initexmf --edit-config-file=latex
为了Ubuntu, 尝试这个:
gedit .miktex/texmfs/config/miktex/config/latex.ini
在打开的文件中(可能是空的),添加:
主内存=12000000
保存文件并退出。然后在命令窗口中输入:
initexmf --dump=latex
然后对 pdflatex 重复上述步骤(替换latex
为pdflatex
)。如果错误仍然存在,请尝试增加该main_memory
值。对于 lualatex,内存分配是动态的,因此上述步骤是不必要的,但如果 lualatex 编译失败,也请尝试一下。