我有一个 870 mb 的 tikz 文件,我想使用一些 latex 来编译它。我该怎么做?我尝试将主内存量增加到 latex 的最大值,但仍然无法渲染。目前我在编译时得到以下输出。我使用此工具在计算机上生成了该文件https://gephi.org使用 tikz 输出导出。
我在下面答案中执行了修复,现在我收到此错误
答案1
错误信息显示:
! TeX capacity exceeded, sorry [pool size=3141349].
可以增加池大小,为了进行测试,可以使用环境变量在命令行上进行:
$ pool_size=10000000 latex openordconceptnet4.tex
这也可以在中进行配置texmf.cnf
,请参阅条目pool_size
。
但是,它不能增加到无穷大,并且还有许多其他内存限制。某些内存可以像池大小一样增加。对于其他值,必须重新生成格式才能生效。
当内存限制无法进一步增加时,真正的问题就开始了。然后可以尝试将大文件分成几个小文件,然后再连接输出文件。或者必须尝试使 TeX 代码在内存限制下更高效。
答案2
根据您发布的较小示例的代码,您使用的工具会生成冗余的 LaTeX 代码
\usepackage{tikz, tkz-graph}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}
我不清楚最后三行有什么用。它preview
对于生成独立输出很有用(例如,在 emacs 的 AucTeX 预览模式中使用)。
主要代码似乎分为两部分:一部分是\node
定义,另一部分\Edges
是定义。可以进行多种优化。
\begin{tikzpicture}
\node at (-2.6682776,7.9326984) [circle, line width=1, fill=COLOR0, inner sep=0pt, minimum size = 14.3428574pt, label={[label distance=0] 315:Myriel}] (1) {};
\node at (-4.1808344,9.4046475) [circle, line width=1, fill=COLOR0, inner sep=0pt, minimum size = 2pt, label={[label distance=0] 315:Napoleon}] (2) {};
...
\node at (2.3879364,1.7951599) [circle, line width=1, fill=COLOR3, inner sep=0pt, minimum size = 10.2285728pt, label={[label distance=0] 315:Brujon}] (76) {};
\node at (7.1218353,4.9839259) [circle, line width=1, fill=COLOR8, inner sep=0pt, minimum size = 10.2285728pt, label={[label distance=0] 315:MmeHucheloup}] (77) {};
在示例中,似乎节点的许多参数完全相同circle
,,line width=1
。inner sep=0pt
每当有重复时,就会无缘无故地消耗一些内存。更有效的方法是收集相同的值并仅声明一次。这可以使用\tikzset{<parameters>}
\begin{tikzpicture}
\tikzset{circle, line width=1, inner sep-0pt, label distance=0pt}
\node at (-2.6682776,7.9326984) [fill=COLOR0, minimum size = 14.3428574pt, label={315:Myriel}] (1) {};
\node at (-4.1808344,9.4046475) [fill=COLOR0, minimum size = 2pt, label={315:Napoleon}] (2) {};
...
\node at (2.3879364,1.7951599) [fill=COLOR3, minimum size = 10.2285728pt, label={315:Brujon}] (76) {};
\node at (7.1218353,4.9839259) [fill=COLOR8, minimum size = 10.2285728pt, label={315:MmeHucheloup}] (77) {};
因为\Edges
参数没有必要被交换。
\tikzset{EdgeStyle/.style = {-, shorten >=1pt, >=stealth, bend right=10, line width=0.5, color=COLOR0}}
\Edge (2)(1)
\Edge (5)(1)
\Edge (6)(1)
\Edge (7)(1)
\Edge (8)(1)
\tikzset{EdgeStyle/.style = {-, shorten >=1pt, >=stealth, bend right=10, line width=1, color=COLOR0}}
\Edge (9)(1)
\tikzset{EdgeStyle/.style = {-, shorten >=1pt, >=stealth, bend right=10, line width=0.5, color=COLOR0}}
\Edge (10)(1)
首先,有很多不必要的重复。有些参数可以一次取一个值,而不是一遍又一遍地重复相同的值,浪费 TeX 内存字数。因此 cade 可以用于\tikzset{EdgeStyle/.style = {<parameters>}}
固定参数,并\tikzset{EdgeStyle/.append style}
针对以下边修改需要修改的参数
\tikzset{EdgeStyle/.style = {-, shorten >=1pt, >=stealth, bend right=10, line width=0.5, color=COLOR0}}
\Edge (2)(1)
\Edge (5)(1)
\Edge (6)(1)
\Edge (7)(1)
\Edge (8)(1)
\tikzset{EdgeStyle/.append style = {line width=1, color=COLOR0}}
\Edge (9)(1)
\tikzset{EdgeStyle/.append style = {line width=0.5, color=COLOR0}}
\Edge (10)(1)
从示例中可以看出,唯一发生变化的参数是line widht
和color
。示例中有无数个同时使用两个参数的情况,但只需更改其中一个参数,因此上述代码的进一步优化是
\Edge (8)(1)
\tikzset{EdgeStyle/.append style = {line width=1, color=COLOR0}}
\Edge (9)(1)
\tikzset{EdgeStyle/.append style = {line width=0.5}}
\Edge (10)(1)
上述一些优化可以通过简单的搜索和替换机制完成(在示例中,我能够使用它们节省大约 10% 的记忆词)。最后的优化可以通过一些巧妙的脚本完成。另一个优化是将尽可能多的更改组合在一起(例如,所有\Edge
具有相同line width
或 的s color
)
希望能帮助到你