1

我需要使用 gnuplot 处理大量数据文件,以便生成电影中收集的图像。由于该过程非常耗时,我想并行生成帧,并且应不时打印一条小消息以通知用户进度。

我尝试了makefile方法:

SOURCES=$(wildcard ./*.in)
OBJECTS=$(SOURCES:.in=.out)

all: $(OBJECTS)

%.out: %.in
  ./worker.sh $< $@ 

worker.sh 是:

gnuplot << EOF
set some_gnuplot_options
set output "$2"
plot "$1" 
EOF

但:

  1. 我无法打印进度消息,
  2. 我更喜欢单文件解决方案(我没有成功将内容worker.sh直接放在makefile中),
  3. 对于包含所有指令的单个 gnuplot 脚本,该解决方案引入了相当多的开销。

可能最终的解决方案是为 gnuplot 提供一个不错的 c++ 接口,但我不太了解现有的接口,而且我不确定如何完成这项工作。还有什么想法吗?请避免暗示像 GNU 并行这样的新程序或不太常见的程序,因为我无法在我使用的某些机器上使用它们。

4

1 回答 1

1

从您的评论听起来好像您可以使用自己的脚本。GNU Parallel 可以作为脚本使用,不需要安装,然后你可以创建一个文件parallel_plotter

#!/home/tange/bin/parallel --shebang-wrap -v A={} /usr/bin/gnuplot

name=system("echo $A")
set term png
set output name.".png"
plot sin(x*name)/x

将 /home/tange/bin/parallel 替换为将脚本并行放置的完整路径。

然后:

chmod 755 parallel_plotter
./parallel_plotter 1 2 3 4 5

这将为每个完成的运行打印一行。


为了避免 /home/tange/bin/parallel 的完整路径,我可以提出以下解决方案:

#!/usr/bin/env gnuplot

name=system("echo $A")
set term png
set output name.".png"
plot sin(x*name)/x

然后:

chmod 755 parallel_plotter
parallel -v A={} ./parallel_plotter ::: 1 2 3 4 5

您担心生成 gnuplot 会产生大量开销。我用以下方法测试了上述内容:

./parallel_plotter {1..1000}

那花了10秒。所以在我的系统上启动 gnuplot 的开销是每个作业不到 100 毫秒。

于 2013-07-29T09:50:48.773 回答