PGFPlot:单个图对于主内存来说太大了

PGFPlot:单个图对于主内存来说太大了

如果我们运行以下 Python 程序,我们会得到 100,000 行test.dat

import random
with open("test.dat","w") as f:
   f.write("x y label\n")
   for i in range(0,100000):
     clazz = 0
     if i % 2 == 0:
         clazz = 1
     f.write(str(random.uniform(-10,10))+" "+str(random.uniform(-10,10))+" "+str(clazz)+"\n")

如果我现在pdflatex -shell-escape test.tex在以下 MWE 上运行,它会崩溃:

失败原因:TeX capacity exceeded, sorry [main memory size=5000000].

然而kpsewhich -a texmf.cnf有报道称:

/etc/texmf/web2c/texmf.cnf
/usr/share/texmf/web2c/texmf.cnf
/usr/share/texlive/texmf-dist/web2c/texmf.cnf

但是第一个文件中没有这个设置。在其他两个文件中,我可以将其缩放到 12000000,然后fmtutil-sys --all

  • 我仍然有这个错误;
  • 它仍然告诉我有 5000000。但是它似乎拾取了这些值,因为如果我超过(15000000),我就会收到错误Ouch---my internal constants have been clobbered!---case 14,但如果我将设置更改为 12,为什么它会报告 5?

这怎么可能?

如何使其工作?(PS:是的,对于 100K 你会有一些重叠,但实际上它接近 50K,并且我想避免预处理以减少重叠,因为重叠也取决于缩放)。

平均能量损失

\documentclass{book}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{external}
\tikzexternalize
\begin{document}

 \begin{figure}
\centering
\resizebox {\columnwidth} {!} {
\begin{tikzpicture}
\pgfplotsset{ticks=none}
    \begin{axis}[legend style={
at={(0,0)},legend columns=2,  /tikz/column 2/.style={
                column sep=10pt,
            },
anchor=north west,at={(axis description cs:0,-0.03)}}]]
    \addplot[fill opacity=0.4,draw opacity=0.4,
            scatter/classes={
                0={mark=*,green},
                1={mark=*,red}
                },
                scatter, only marks,
                scatter src=explicit symbolic]
         table[x=x,y=y,meta=label]
            {test.dat};
            \legend{Class A, Class B}
    \end{axis}
\end{tikzpicture}
}
\end{figure}
\end{document}

答案1

设置的大小是有限制的,不过你可以使用 luatex,它使用动态内存。这需要很长时间(在 xpdf 中渲染也需要很长时间),但是

在此处输入图片描述

你缺少了两%行末尾的行,我也添加了

\RequirePackage{luatex85}
\documentclass{book}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{external}


\tikzexternalize
\begin{document}

 \begin{figure}
\centering
\resizebox {\columnwidth} {!} {%%%
\begin{tikzpicture}
\pgfplotsset{ticks=none}
    \begin{axis}[legend style={
at={(0,0)},legend columns=2,  /tikz/column 2/.style={
                column sep=10pt,
            },
anchor=north west,at={(axis description cs:0,-0.03)}}]]
    \addplot[fill opacity=0.4,draw opacity=0.4,
            scatter/classes={
                0={mark=*,green},
                1={mark=*,red}
                },
                scatter, only marks,
                scatter src=explicit symbolic]
         table[x=x,y=y,meta=label]
            {test.dat};
            \legend{Class A, Class B}
    \end{axis}
\end{tikzpicture}%%%%
}
\end{figure}
\end{document}

相关内容