複数の個別ジョブに1つの入力ファイルを使用する方法

複数の個別ジョブに1つの入力ファイルを使用する方法

ファイルを読み取り、さまざまなパラメータを使用して複数のタスクを実行し、最終的に各出力を別々のファイルとして保存したいと思います。

現在、私は以下のコードスニペットに示すようにこれを行います。これは実際に画像を変更することなく各反復で画像を読み取る。大きな画像(ここでは400 MB)の場合、速度は非常に遅くなります。メモリが十分に大きくてメモリにロードしてメモリから一度だけ処理しても大丈夫です。しかし、どうすればいいのかわかりません。 ImageMagick以外のシェルにはありません。

  1. ImageMagickこれを行うための基本的な方法はありますか?
  2. メモリマッピングファイルシステムにファイルを一度コピーし、以下のスクリプトを使用するのが最も簡単ですか?
#!/bin/sh

FILE=foo.tif
i=65;END=80;STEP=1
while [ $i -le $END ]; do
convert $FILE -threshold ${i}\% ${i}.png &
i=$((i+$STEP))
done

もしシェル部分POSIX規格を維持します。編集:取得したコアを活用するためにバックグラウンドでサブプロセスを開始しました。

ベストアンサー1

これ最も単純なこれを行う方法は次のとおりです。GNUパラレル、これはスクリプトとほぼ同じ作業順序を生成しますが(プロセスと並列処理の点で)、はるかに簡潔です。

したがって、次の画像から始めてください。

ここに画像の説明を入力してください。

以下を実行できます。

parallel magick image.jpg -threshold {}% {}.jpg ::: {65..80}

シーケンスにアニメーションを適用すると、次のような結果が得られます。

ここに画像の説明を入力してください。


画像を一度だけロードして何度も何度も実行するには、実際にMagicスクリプトが必要です。したがって、次のように生成できます。

for ((t=65;t<=80;t++)) ; do
   printf "( -clone 0 -threshold ${t}%% -write ${t}.jpg +delete )\n"
done

これにより、次のスクリプトが生成されます。

( -clone 0 -threshold 65% -write 65.jpg +delete )
( -clone 0 -threshold 66% -write 66.jpg +delete )
( -clone 0 -threshold 67% -write 67.jpg +delete )
( -clone 0 -threshold 68% -write 68.jpg +delete )
( -clone 0 -threshold 69% -write 69.jpg +delete )
( -clone 0 -threshold 70% -write 70.jpg +delete )
( -clone 0 -threshold 71% -write 71.jpg +delete )
( -clone 0 -threshold 72% -write 72.jpg +delete )
( -clone 0 -threshold 73% -write 73.jpg +delete )
( -clone 0 -threshold 74% -write 74.jpg +delete )
( -clone 0 -threshold 75% -write 75.jpg +delete )
( -clone 0 -threshold 76% -write 76.jpg +delete )
( -clone 0 -threshold 77% -write 77.jpg +delete )
( -clone 0 -threshold 78% -write 78.jpg +delete )
( -clone 0 -threshold 79% -write 79.jpg +delete )
( -clone 0 -threshold 80% -write 80.jpg +delete )

したがって、というファイルに書き込むと、script.mgk次のように実行できます。

magick image.jpg -script script.mgk

スクリプトを複数回再利用します。


または生成することができます。「すぐに」(一時ファイルを作成する必要はありません) パイプで接続イメージマジシャンこのように:

for ((t=65;t<=80;t++)) ; do 
   printf "( -clone 0 -threshold ${t}%% -write ${t}.jpg +delete )\n"
done | magick image.jpg -script -

これは上記と同じ結果を生成しますが、POSIXと互換性があります。単一のインスタンスだけが起動するのがわかります。イメージマジシャン、入力画像を一度だけ読み込み、再度使用してください。

おすすめ記事