我正在尝试编译由 matlab2tikz 生成的密集图(文件大小 ~ 50Mb)。我正在运行 lualatex 并使用 lualatex 进行外部化
\tikzset{external/system call={lualatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
对于文件大小约为 5Mb 的情况,一切正常,但跳转到 50Mb 会失败。当我查看 5Mb 运行的配置文件时,这些进程使用了几百 Mb 的 RAM,而外部化的 pdf 大约是 1Mb。这让我认为跳转到 50Mb 应该没问题。此外,根据 pgfplots 手册,lualatex 运行时与数据点数量大致呈线性关系,因此内存消耗也必须如此。
目前 lualatex 的错误是TeX capacity exceeded [token memory size=75830065]
。这很奇怪,因为我在运行该过程时至少有 12Gb 的 RAM 可用,所以我认为如果内存是动态分配的,不应该导致这种情况。此外,当我查看配置文件时,它失败了,而它只消耗了几百 MB 的 RAM,所以还有很大的增长空间。
1)是否存在对 pdflatex 的其他错误调用,或者不属于动态内存分配的类似内容?
2) 如果不是,为什么 lualatex 会失败?还有其他参数可以扩展吗?
使用 TeXstudio 在 Windows 8 上运行 TeX Live 2014。以下是日志文件的结尾:
("../../Matlab/simulations/sigma f-poly k-3 i-0.0001 s-0.001 nt-1 nb-0.0
1 const-1 HDD-0 minT-40 ds-100"
Runaway text?
\par \begin {axis}[width=\threeW , height=\threeH , scale only axis,\ETC.
! TeX capacity exceeded, sorry [token memory size=75830065].
<argument> ...52 0.0961556466390988\\ 0.3653 0.096155646\8ETC
l.2002060 \end{axis}
If you really absolutely need more capacity,
you can ask a wizard to enlarge me.
Here is how much of LuaTeX's memory you used:
27544 strings out of 494693
100000,75830065 words of node,token memory allocated 15902 words of node memory still in use:
146 hlist, 17 vlist, 15 rule, 116 disc, 34 math, 400 glue, 167 kern, 47 penal
ty, 1534 glyph, 162 glue_spec, 4 action, 3 temp, 1 if_stack, 8 local_par, 3 dir,
4 pdf_start_link, 4 pdf_end_link, 3 pdf_colorstack nodes
avail lists: 2:32,3:415,4:706,5:138,6:1117,7:73,8:36,9:345,10:106
30092 multiletter control sequences out of 65536+600000
53 fonts using 1491859 bytes
62i,20n,83p,1229b,546s stack positions out of 5000i,500n,10000p,200000b,100000s
! ==> Fatal error occurred, no output PDF file produced!
编辑
正如评论中所述,我尝试预处理其中一个文件。这是一个 MWE,不是内存错误(因为文件现在约为 5Mb),而是新错误。删除外部化在这里也失败了。
\documentclass[10pt,a4paper]{article}
\usepackage{pgfplots}
\usepackage{tikz}
\pgfplotsset{compat=1.11}
\usetikzlibrary{external}
\tikzset{external/system call={lualatex -shell-escape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzexternalize[prefix=compiled/]
\begin{document}
\newlength{\threeW}
\newlength{\threeH}
\setlength{\threeW}{1.2in}
\setlength{\threeH}{1.8in}
\input{small.tex}
\end{document}
编辑2
看起来,lualatex 在处理大文件时,$\text{z}$
在轴标签中看到时会失败(当然应该是$z$
,它是 matlab2tikz 进程的结果),这就是导致错误的原因,类似于导入 Matlab 图形时未定义控制序列 \text。这很奇怪,因为在小文件中不会抛出此错误。这太荒谬了。如果这不是真正的解决方案,我会报告。
答案1
这不是一个真正的答案,因为它没有解决问题,也没有提供太多说明,但我认为值得写它,而且对于评论来说太长了。
您的配置文件显示只使用了 100Mb 内存,这是错误的。只有使用的令牌内存要大得多,我将简要说明,并且还有其他类型的内存在使用中(字符串内存、节点内存等)
"token memory size"
我在 luatex 源代码中搜索了出现在您的输出中的字符串。它出现在textoken.w
:
smemory_word *new_fixmem; /* the big dynamic storage area */
t = (fix_mem_max / 5);
new_fixmem =
fixmemcast(realloc
(fixmem, sizeof(smemory_word) * (fix_mem_max + t + 1)));
if (new_fixmem == NULL) {
runaway(); /* if memory is exhausted, display possible runaway text */
overflow("token memory size", fix_mem_max);
} else {
fixmem = new_fixmem;
}
因此我们可以从这里进行一些计算。消息“token memory size”旁边输出的数字是变量的当前值fix_mem_max
,这恰好就是您的情况。这是为令牌内存保留的 s75830065
的数量。每个都是一个结构(在 中定义),具有两个字段,每个字段的类型为,它在其他地方定义为 32 位整数。因此每个“token”是 64 位,因此为令牌列表分配的实际内存为*8 字节。smemory_word
smemory_word
textoken.h
halfword
fix_mem_max
在您的例子中,这意味着75830065*8
=606640520
字节,大约为 578Mb。仍然远低于您的 12Gb,但比您的分析器报告的 100Mb 多得多。
当 TeX 耗尽可用的令牌内存(在您的情况下分配了 578Mb)并尝试通过 扩展它时会触发此错误realloc
,但由于主系统内存也耗尽而失败。
您可以在上面的代码中看到,新的尝试大小是先前sizeof(smemory_word) * (fix_mem_max + t + 1))
计算t
的fix_mem_max/5
,因此在您的情况下数字是:8*(75830065+75830065/5+1)
给出727968632
字节(大约 694Mb)。
虽然这些数量远低于您拥有的 12Gb RAM,但它们只是令牌内存。如前所述,LuaTex 还使用其他类型的内存,因此总数可能在 1Gb 左右或更多。不过,我不知道这是否足以解释问题,或者 LuaTeX 内部是否存在一些错误,导致无法实际使用所有可用 RAM。尽管如此,这些数字还是很大。