我尝试使用 绘制一个很大的数据集pgfplots
。由于我知道大文件存在问题,因此我使用了外部模式。我另外将 增加到main_memory
。3000000
但6000000
它还是崩溃了,说pdflatex
超出了主内存。但如果我在编译期间查看系统的内存消耗,我看不到内存使用量有任何增加。我找不到任何解释main_memory
需要什么,是字节还是千字节?如果我将其增加到更大的值,fmtutil-sys --all
将会失败并且pdflatex
不再起作用。我能以某种方式解决这个问题吗?
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepgfplotslibrary{external}
\tikzexternalize
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot table[x expr=\coordindex, y index=0] {largefile};
\end{axis}
\end{tikzpicture}
\end{document}
我也尝试用 进行编译lualatex
(只是pdflatex
用替换lualatex
),但这似乎也调用了pdflatex
?至少我收到了这个错误信息(lualatex
和 也是一样pdflatex
):
! Package tikz Error: Sorry, the system call 'pdflatex -halt-on-error -interact
ion=batchmode -jobname "report-figure0" "\def\tikzexternalrealjob{report}\input
{report}"' did NOT result in a usable output file 'report-figure0' (expected on
e of .pdf:.jpg:.jpeg:.png:). Please verify that you have enabled system calls.
For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it is also named 'wri
te 18' or something like that. Or maybe the command simply failed? Error messag
es can be found in 'report-figure0.log'. If you continue now, I'll try to types
et the picture.
摘录自report-figure0.log
:
! TeX capacity exceeded, sorry [main memory size=6000000].
\pgfplotsapplistXXpushback@smallbufoverfl ...toka
\the \t@pgfplots@tokb \the...
l.13 ... expr=\coordindex, y index=0] {largefile};
^^M
largefile
大小为 5.7 Mb,有 593932 个数据点。我几乎不敢说我还有一个大小为 163 Mb 的文件,有 18928305 个数据点。我认为这没问题,因为 gnuplot 可以快速处理这些文件,没有任何问题。
的头largefile
:
9409252
17298051
21351017
24466010
26952485
29389696
31442872
33345635
35029538
36710432
请查找数据集这里。
我正在使用 texlive2012:
$ pdflatex
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
restricted \write18 enabled
$ lualatex
This is LuaTeX, Version beta-0.70.2-2012052410 (TeX Live 2012)
restricted \write18 enabled.
答案1
这是一个非常密集采样的数据集!正如 Paul Gaborit 在评论中指出的那样,您需要首先对其进行下采样,尤其是当数据如此平滑时。绘制每个数据点将使文件大小膨胀并降低渲染性能,而不会为绘图增加任何价值。
您可以gnuplot
在 PGFPlots 中使用 来对数据进行下采样。如果您只绘制每 1000 个点,则绘图与完整数据没有区别,但您可以坚持pdflatex
使用 而不必使用lualatex
。
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepgfplotslibrary{external}
\tikzexternalize
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot [no markers] gnuplot [raw gnuplot] {
plot "largefile.csv" using ($0*1000):1 every 1000; % $0 is the dummy column for the coordinate index
};
\end{axis}
\end{tikzpicture}
\end{document}
如果需要非均匀采样,只需连接几个plot
命令即可:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepgfplotslibrary{external}
\tikzexternalize
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot [no markers] gnuplot [raw gnuplot] {
plot "largefile.csv" using ($0):1 every 1::1::300;
plot "largefile.csv" using ($0*100+300):1 every 100::300::6000;
plot "largefile.csv" using ($0*1000+6000):1 every 1000::6000
};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
您可以使用这个简单的 sed 单行程序来减少数据,例如每 200 个值
sed -n '1~200p' < large.data > large200.data
那么就可以轻松地绘制它。
前 200 个,然后每 1000 个的替代方案是:
sed '1,200!d' < large.data > large1000.data
sed -n '201~1000p' < large.data >> large1000.data