对于一个非常大的文档,使用 编译大约 30 分钟后context
,我收到此错误:
! TeX capacity exceeded, sorry [node memory size=100987760].
texmf.cnf
我添加了一行node_memory_size=1000000000
,将内存大小增加 10 倍,然后运行sudo fmtutil-sys --all
,但仍然出现错误。
- 我需要改变什么值才能使该文档编译?
答案1
luatex 中的节点内存在需要时会自动重新分配,因此您已经耗尽了内存,或者(更可能)达到了操作系统愿意分配给单个进程的内存量限制。
通常,这意味着宏编程错误,这不是 luatex 本身的错误。如果您使用\tracingall
添加运行输入文件,您可能会看到(大量)重复输出,表明某处存在错误递归。没有您的输入就无法确定,但这种诊断是相当安全的选择。
那么为什么会有下限呢?您看到的数字不是以字节为单位,而是以内存字为单位,通常为 8 个字节。重新分配使用 realloc(),这意味着新值和旧值同时处于活动状态。您看到的是旧数字,因此新数字将接近 2Gb ((1+1.25) * 8 * 100987760)。加上正在使用的剩余 luatex 内存,只有 2GB 的实际内存,您就不必再对致命错误感到惊讶了。
答案2
摘自 LuaTeX 手册,第 187 页
传统 TeX 用于存储 token 和节点的单个内部内存堆被分成两个独立的数组。每个数组都会在需要时动态增长。
与主内存相关的 texmf.cnf 设置不再使用(这些是:
main_memory
、mem_bot
和)。“主内存不足”错误仍然可能发生,但限制因素现在是系统extra_mem_top
中extra_mem_bot
的 RAM 数量,而不是预定义的限制。