![增加 latex 的硬编码内存限制](https://linux22.com/image/322454/%E5%A2%9E%E5%8A%A0%20latex%20%E7%9A%84%E7%A1%AC%E7%BC%96%E7%A0%81%E5%86%85%E5%AD%98%E9%99%90%E5%88%B6.png)
我正在绘制一个三维曲面图pgfplots
,其中输入的数据来自一些模拟结果。
由于着色器选项faceted interp
会产生巨大的 pdf 文件,我想切换到faceted
并增加数据点的数量……但在某个时候,由于主内存大小有限,我在使用 pdflatex 进行编译时遇到了问题,所以我切换到了 lualatex。即使使用 lualatex,我也遇到了一些错误,例如Tex capacitiy exceeded, save size = 100000
。所以我增加了保存大小,但 Tex 中似乎有一个硬编码限制,为 250.000!(编译最多只使用大约 570MiB 的 RAM,所以此时我还有 30 GiB 的可用 RAM……)
我的代码如下:
\documentclass[class=scrbook, 11pt,convert]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\pgfplotsset{colormap={ownbluered}{[1cm] rgb255(0cm)=(0,0,255); rgb255(30cm)=(0,255,255); rgb255(60cm)=(0,255,128); rgb255(80cm)=(0,255,0); rgb255(90cm)=(192,255,0);
rgb255(115cm)=(255,255,0); rgb255(140cm)=(255,128,0); rgb255(155cm)=(255,0,0); rgb255(160cm)=(230,0,0)}
}
\pgfplotsset{
nonlinear colormap trafo/.code 2 args={
\pgfkeysalso{
y coord inv trafo/.code={%
\pgfmathparse{##1 < 30 ? (##1-30)*(-#2)/30 : (##1-30)*#1/30}%
},
}%
},
nonlinear colormap around 30/.code 2 args={
\pgfkeysalso{
colorbar style={
nonlinear colormap trafo={#1}{#2},
},
}%
},
}
\begin{document}
\def\infile{linear_directivity_1deg.txt}
\def\filenamedB{\infile_dB.txt}
\def\directivity{6.3}% in dB!
\def\directivitymin{-26}% in dB!
\edef\threedB{45}%
\pgfmathparse{\directivitymin+30}
\edef\minimum{\pgfmathresult}%
\pgfmathparse{\directivitymin/2+30}
\edef\halfminimum{\pgfmathresult}%
\begin{tikzpicture}
\begin{axis}[height=10cm, colorbar, colormap name=ownbluered, z buffer=sort, view={135}{25}, mesh/ordering=y varies, axis equal image, nonlinear colormap around 30={\directivity}{\directivitymin},
colorbar style={
ytick={\minimum,\halfminimum,30,\threedB,60},
%yticklabel={\pgfmathparse{int(\tick)}\pgfmathresult\,dBi},
%yticklabel={\SI{\pgfmathprintnumber[precision=1]{\tick}}{\dBi}},
yticklabel={\pgfmathprintnumber[precision=1]{\tick}\,dBi},
%y unit = dBi,
yticklabel style={align=right, text width = 4em,},
yshift=-1cm,
height=5cm,
},
axis lines=none, enlargelimits=false,]
\addplot3[mesh/rows=181, surf, point meta=\thisrow{dir},line width = 0.025pt] table [x = x,y = y,z = z,] {\filenamedB};
\end{axis}
\end{tikzpicture}
\end{document}
读取的.txt文件可以可以在这里找到。
是否有可能改进我的代码,以便减少所需的保存大小?或者我可以编译软件的部分内容并将内置限制更改为 tex.mf 中的限制?
答案1
这个答案解决了你的子问题“是否有可能改进我的代码,以便需要更少的保存大小?”
幸运的是,答案是肯定的(前提是你至少拥有pgfplots
1.12 并且继续使用lualatex
)。
我期望代码能够使用新的lua backend
,即 Lua 中一些昂贵函数的部分重新实现。如果这样做了,它应该可以避免 TeX 内存限制。然而,该.log
文件声称
Package pgfplots info on input line 50: Using 'lua backend=false' for plot 0 (ty
pe 'mesh'): point meta choice does not support LUA.
这让我不得不绕过当前的point meta
选择。我记得lua backend
如果point meta
包含 TeX 宏,则 会被禁用(因为这些宏无法轻松迁移到 Lua 脚本库)。当我使用而不是point meta=explicit
结合时,内存问题就解决了,我可以用 编译您的示例。请注意, 的两种表述对于您的情况都是等效的,但您的表述更易于阅读和记忆。\addplot .... table[..., meta=dir]
point meta=\thisrow{dir}
lualatex
point meta
以下是完整示例及其结果:
\documentclass[class=scrbook, 11pt,convert]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\pgfplotsset{colormap={ownbluered}{[1cm] rgb255(0cm)=(0,0,255); rgb255(30cm)=(0,255,255); rgb255(60cm)=(0,255,128); rgb255(80cm)=(0,255,0); rgb255(90cm)=(192,255,0);
rgb255(115cm)=(255,255,0); rgb255(140cm)=(255,128,0); rgb255(155cm)=(255,0,0); rgb255(160cm)=(230,0,0)}
}
\pgfplotsset{
nonlinear colormap trafo/.code 2 args={
\pgfkeysalso{
y coord inv trafo/.code={%
\pgfmathparse{##1 < 30 ? (##1-30)*(-#2)/30 : (##1-30)*#1/30}%
},
}%
},
nonlinear colormap around 30/.code 2 args={
\pgfkeysalso{
colorbar style={
nonlinear colormap trafo={#1}{#2},
},
}%
},
}
\begin{document}
\def\infile{linear_directivity_1deg.txt}
\def\filenamedB{\infile_dB.txt}
\def\directivity{6.3}% in dB!
\def\directivitymin{-26}% in dB!
\edef\threedB{45}%
\pgfmathparse{\directivitymin+30}
\edef\minimum{\pgfmathresult}%
\pgfmathparse{\directivitymin/2+30}
\edef\halfminimum{\pgfmathresult}%
\begin{tikzpicture}
\begin{axis}[height=10cm, colorbar, colormap name=ownbluered, z buffer=sort, view={135}{25}, mesh/ordering=y varies, axis equal image, nonlinear colormap around 30={\directivity}{\directivitymin},
colorbar style={
ytick={\minimum,\halfminimum,30,\threedB,60},
%yticklabel={\pgfmathparse{int(\tick)}\pgfmathresult\,dBi},
%yticklabel={\SI{\pgfmathprintnumber[precision=1]{\tick}}{\dBi}},
yticklabel={\pgfmathprintnumber[precision=1]{\tick}\,dBi},
%y unit = dBi,
yticklabel style={align=right, text width = 4em,},
yshift=-1cm,
height=5cm,
},
axis lines=none, enlargelimits=false,]
\addplot3[mesh/rows=181, surf, shader=interp, point meta=explicit,line width = 0.025pt] table [x = x,y = y,z = z,meta=dir] {\filenamedB};
\end{axis}
\end{tikzpicture}
\end{document}
请注意,.pdf
由于示例中有很多补丁,因此生成的文件很大,为 2.5 MB,并且需要很长时间才能渲染。
如果要减小其大小,可以使用shader=interp
;生成的文件大小减小到 1.1 MB,渲染时间也大大加快。在本例中,图形如下所示:
一些关于“展望”的评论:也许它lua backend
会变得足够聪明,能够理解你的初始代码。也许它也会变得足够聪明,可以读取输入文件,而不需要昂贵的 TeX 例程。两者都在计划中,并将使漫长的编译时间减少几个数量级……
编辑
这种情况shader=faceted
导致我的系统内存使用情况如下
Here is how much of LuaTeX's memory you used:
25089 strings out of 494748
100000,109195293 words of node,token memory allocated
3090 words of node memory still in use:
82 hlist, 6 vlist, 1 rule, 10 math, 244 glue, 5 kern, 5 penalty, 32 glyph, 72
glue_spec, 1 write, 5 local_par, 204 pdf_literal, 2 pdf_refxform, 10 pdf_colors
tack nodes
avail lists: 2:46,3:211,4:287,5:5,6:47,7:1,9:93,10:3
27874 multiletter control sequences out of 65536+600000
26 fonts using 1033763 bytes
79i,10n,103p,718b,2731s stack positions out of 5000i,500n,10000p,27176575b,100000s
<</home/ludewich/tl2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb><</
我相信这2731
是保存大小(限制 100000)