本周,我在笔记本电脑上使用 LuaTeX 编译文档时遇到了问题,LuaTeX 似乎占用了尽可能多的内存,导致笔记本电脑彻底崩溃——也就是说,需要硬重置,因为它在 10 分钟后没有响应。笔记本电脑有 6 GB 可用内存,但当我同时打开 GNOME、Chromium、多个 PDF 等时,LuaTeX 显然不会使用所有这些内存。
有问题的文档都使用了 TikZ 外部化,通常有大约 3 或 4 个 TikZ 图像以及一些其他图像\includegraphics
,并且通常只有大约 10 页长。崩溃似乎发生在 LuaTeX 分叉(?)另一次运行以编译 TikZ 图像时。使用 观察系统性能htop
,我经常会看到 LuaTeX 消耗了系统内存的 15-20% 以上(约 1700 MiB)每个进程。
如何限制 LuaTeX 可以使用的内存量?
我真的不知道还要提供什么其他信息,因为使用 MWE 进行测试并不会消耗如此多的资源,而且过去社区成员并不乐意看到我分享整个有故障的文档。
编辑更多信息:
tlmgr
我的系统是 TeXLive 2017,带有 LuaTeX 1.04。自从去年使用推荐的全新安装方法更新 TeXLive 以来,我还没有运行过更新。
该文档使用了 KOMAscrartcl
类和软件包fontspec
、xcolor
、graphicx
、etoolbox
、microtype
、、、、、、、、、physics
、、、、、、、、、和。其中大部分是我几乎总是在文档中使用的常用软件包集,复制前言并注释掉我知道不会使用的软件包。TikZ 本身会加载以下库:xfrac
mathtools
unicode-math
siunitx
isodate
scrpage2
caption
subfig
tikz
pgfplots
pgfplotstable
enumitem
array
tabulary
multirow
multicol
booktabs
floatrow
biblatex
glossaries
hyperref
hypcap
cleveref
\usepgflibrary{luamath}
\pgfkeys{pgf/luamath=parser}
\usepgflibrary{fpu}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{decorations.pathmorphing}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{decorations.shapes}
\usetikzlibrary{intersections}
\usetikzlibrary{positioning}
\usetikzlibrary{external}
\usetikzlibrary{patterns}
\usepgflibrary{arrows.meta}
\usetikzlibrary{bending}
\usetikzlibrary{angles}
这些是一份特别麻烦的文件中的图像:
最复杂的图像使用大量命名坐标来确保所有内容正确对齐,并省去了我手动计算坐标的麻烦。我最初没有将这幅图像外部化。
在我的台式电脑上编译文档并不是什么大问题,因为台式电脑有 12 GB 的 RAM,因此使用 1700 MB 的进程不会对它造成太大的困扰。但我仍然觉得这是一个非常大的内存量。
答案1
在 Linux 系统上运行时,可以使用程序 限制 LuaTeX 的内存消耗ulimit
。在示例中,我将最大内存大小 ( -m
) 和虚拟内存 ( -v
) 分别设置为 100000 千字节。
$ ulimit -m 100000 -v 100000
$ lualatex test.tex
This is LuaTeX, Version 1.07.0 (TeX Live 2018)
...
[1fatal: memory exhausted (xmalloc of 2802244 bytes).
正如您所见,这太少了,LuaTeX 将因内存不足而崩溃。
答案2
这个问题似乎在较新版本的 LuaTeX 中得到了解决——我最近没有遇到任何崩溃,也没有遇到像描述的那样的 OOM 错误。一旦我确定了大多数图像的结构,我就转而使用 TikZ externalize 库来处理它们。我正在编写一系列包含大量图像的文档,因此如果遇到问题,我可能会密切关注内存使用情况。