【问题标题】:Plot subplots from a very large file in gnuplot在 gnuplot 中从一个非常大的文件中绘制子图
【发布时间】:2017-09-21 15:27:44
【问题描述】:

我有 10GB 的文件,其中包含数十亿个条目。它有很多列。我想将每一列绘制成不同的子图。我使用了以下 MWE:

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 仅提取所需的数据部分而不读取整个文件。只是猜测,尚未对此进行基准测试

标签: plot gnuplot bigdata


【解决方案1】:

我猜整个文件都被读了一遍,但我不确定。如果您在 Linux 系统上,您可以调用 awk 来提取所需的列(但第一列再次被读取两次)

plot "<awk '{print $1 $2}' camkii.dat" with lines     
plot "<awk '{print $1 $23}' camkii.dat" with lines

【讨论】:

  • 现在awk 必须读取文件两次。不知道这样是否更好。
  • 可能会更好,因为完整文件不会同时加载两次......但要获得更多控制权,您应该看看其他工具(例如 gnuplot.py 或 python 的 matplotlib),那里您可以更好地控制内存的分配方式
  • @RaphaelRoth 我已经在使用 matplotlib。不幸的是,使用 matplotlib 绘制数据需要更长的时间(除非我对数据进行采样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多