我正在使用 Django 及其模板系统来动态生成 Latex,然后使用 pdflatex 对其进行编译,效果很好。
问题是,当生成的乳胶长度超过 30,000 行且编译需要 2 多秒时,实际上并没有输出正确的 PDF 文件(即缺少表格),有时甚至会导致 pdflatex 完全崩溃(错误消息是:内存不足)。
有什么方法可以提高性能和/或避免编译崩溃?
我的 latex 没有任何问题,因为当我缩小生成的 latex 大小时,一切都正常。只有当数量增加时,问题才开始出现。
我做了一些研究,大多数答案似乎都在谈论快速编译的技巧,包括绘制和仅编译文档的部分内容。这些策略不适用于我的情况,因为我没有绘制(只是大量的文本,更具体地说是表格行),而且我无法编译部分,因为大多数内容每次都是动态生成的。
编辑1:
@David Carlisle 我使用“tabulary”来生成表格,因为这是我能让列自动尽可能适当地调整宽度的唯一方法。是的,我本来以为内存占用仍然很小,但它似乎很大。
@egreg 和 @David Carlisle 对于 Latex 长度约为 30,000 行的情况,我没有收到任何错误消息(日志文件或控制台),但我确实收到了大量“过满/欠满 hbox”警告(我认为这是无害的)。
至于导致 pdflatex 崩溃的 Latex 文件,我收到的错误是:
Runaway definition?
->\global \let
! TeX capacity exceeded, sorry [main memory size=7000000].
\CT@setup ...\CT@color {\global \let \CT@do@color
\CT@@do@color \color }
l.94583 \end{tabulary}
If you really absolutely need more capacity,
you can ask a wizard to enlarge me.
Here is how much of TeX's memory you used:
1708 strings out of 495028
23123 string characters out of 6181498
7000001 words of memory out of 7000000
4949 multiletter control sequences out of 15000+600000
4782 words of font info for 16 fonts, out of 8000000 for 9000
14 hyphenation exceptions out of 8191
34i,8n,32p,232b,270s stack positions out of 5000i,500n,10000p,200000b,80000s
! ==> Fatal error occurred, no output PDF file produced!
编辑2:
我基本上对 Latex 的内部实现一无所知,所以我根据计算机科学和软件开发的知识提供了答案。从我的角度来看,使用包含如此多零散数据的表格容易受到实现性能不佳(抽象泄漏)的影响。这就是为什么我建议避免使用表格。
之所以有 10,000 多行,是因为文本/数据用于计算机化维护管理系统。这些文档不供广大读者阅读,也不需要过于“漂亮”,它们只需要清晰易读。因此我建议避免使用表格。
是的,每条线的形状都会有所不同,这也许可以解释为什么我遇到性能问题。
答案1
TeX 不受内存限制的影响,可以打印一千万行或 217,392页面在我的笔记本电脑上使用以下代码:
\documentclass{book}
\usepackage{luatexbase, luacode}
\begin{document}
\begin{luacode}
for i=1,10000000 do
tex.print('x','y','z', '\\par')
end
\end{luacode}
tests
\end{document}
实际上,一千万行的限制是任意的,我相信你可以将其翻倍。你只受系统处理大型日志文件的能力的限制pdfs
。首先尝试在循环中少一个零。
只要您发出段落或分页符,TeX 就会处理任意数量的输出,前提是您的系统可以处理 pdf 输出。
因此,我的建议是逐行构建表格,然后将其作为段落发布(或多或少这就是longtable
工作原理。
我已将示例设为 LuaLaTeX 以帮助您进行循环。使用纯 TeX 和简单\loop..\repeat
宏效果会更好。