1

ムービーに集められた画像を生成するために、gnuplot で大量のデータ ファイルを処理する必要があります。この手順には時間がかかるため、フレームを並行して作成し、ユーザーに進行状況を知らせる小さなメッセージを時々出力する必要があります。

私はメイクファイルのアプローチを試しました:

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.shmakefile にコンテンツを直接入れることに成功していません)。
  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 に答える