将超大文件编译成pdf

将超大文件编译成pdf

我正在使用 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 宏效果会更好。

相关内容