增加 latex 的硬编码内存限制

增加 latex 的硬编码内存限制

我正在绘制一个三维曲面图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文件可以可以在这里找到

点数不是很多的示例图(只有 5 度步骤,而不是 1 度): 指向性三维图

是否有可能改进我的代码,以便减少所需的保存大小?或者我可以编译软件的部分内容并将内置限制更改为 tex.mf 中的限制?

答案1

这个答案解决了你的子问题“是否有可能改进我的代码,以便需要更少的保存大小?”

幸运的是,答案是肯定的(前提是你至少拥有pgfplots1.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}lualatexpoint 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)

相关内容