在gnuplot中从一个非常大的文件中绘制子图

3

我有一个包含几十亿条数据的10GB文件。其中有很多列。我想将每一列绘制成不同的子图。我使用了以下的最小工作示例:

set datafile separator ","
set terminal png
set output "a.png"
set multiplot layout 2,1 title ""
plot "camkii.dat" using 1:2 with lines
plot "camkii.dat" using 1:23 with lines

此脚本需要几十秒钟时间。正如您所看到的,我两次调用了plot "camkii.dat" ...。我怀疑每次都读取文件。这不太高效,而且我可能会耗尽内存。
如果我可以将文件读入某个变量(比如说foo),然后使用变量foo绘制每个子图。类似于plot foo[1] ...plot foo [2] ...等。那么我只需一次读取文件。
我怀疑gnuplot可能正在两次加载文件。如果是这样,将文件保存到变量中并绘制它是否有帮助?对MWE建议的更改将非常有帮助。

不,您不能缓存数据以便在第二个图中重复使用。如果您的数据量太大而无法处理,可以尝试使用更高效的方式来保存您的数据,例如hdf5文件格式。然后,您可以使用例如“h5totxt”来提取所需的数据部分,而不必读取整个文件。这只是一个猜测,我还没有进行过基准测试。 - Christoph
1个回答

1
我猜整个文件被读取了两次,但我不确定。如果你在Linux系统上,可以使用awk来提取所需的列(但第一列再次被读取)。
plot "<awk '{print $1 $2}' camkii.dat" with lines     
plot "<awk '{print $1 $23}' camkii.dat" with lines

现在 awk 必须读取文件两次。不确定这是否更好。 - Christoph
也许这样做更好,因为完整文件不会同时加载两次...但是为了更好的控制,你应该看看其他工具(例如gnuplot.py或Python的matplotlib),在那里你可以更好地控制内存分配。 - Raphael Roth
@RaphaelRoth 我已经在使用matplotlib了。不幸的是,使用matplotlib绘制数据需要更长的时间(除非对数据进行采样)。 - Dilawar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接