8

多数(約5200)の画像ファイル(PPM形式、それぞれ5 MBのサイズ)のサイズを変更し、を使用してPNG形式で保存したいと思いますconvert

短縮版:

convertconvert画像ファイルを連続して処理するように指示する構文を使用していますが、24GBのメモリを消費します。

ロングバージョン:

25 GBを超える画像データに関しては、すべてのファイルを同時に処理するべきではないと思います。画像ファイルを連続して処理する方法についてImageMagickのドキュメントを検索したところ、次のことがわかりました

読み取った各画像のサイズを変更する方が高速で、リソースをあまり消費しません。

$ convert '*.jpg[120x120]' thumbnail%03d.png

また、チュートリアルには次のように記載されています

たとえば...の代わりに

montage '*.tiff' -geometry 100x100+5+5 -frame 4 index.jpg

最初にすべてのtiffファイルを読み取り、次にそれらのサイズを変更します。代わりに行うことができます...

montage '*.tiff[100x100]' -geometry 100x100+5+5 -frame 4 index.jpg

これにより、次の画像に進む前に、各画像が読み込まれ、サイズが変更されます。その結果、メモリ使用量がはるかに少なくなり、メモリ制限に達したときにディスクのスワッピング(スラッシング)が防止される可能性があります。

したがって、これは私がしていることです:

$ convert '*.ppm[1280x1280]' pngs/%05d.png

ドキュメントによると、各画像ファイルを1つずつ処理する必要があります:読み取り、サイズ変更、書き込み。これは、12個の実際のコアと24GBのRAMを搭載したマシンで実行しています。ただし、最初の2分間で、convertプロセスのメモリ使用量は約96%に増加します。それはしばらくそこにとどまります。CPU使用率は最大です。もう少し長くなり、プロセスは終了します。

殺された

この時点では、出力ファイルは作成されていません。私はUbuntu10.04を使用していて、次のようにconvert --version言っています。

Version: ImageMagick 6.5.7-8 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2009 ImageMagick Studio LLC
Features: OpenMP 

convert変換を開始する前にすべてのデータを読み取ろうとしているようです。したがって、にバグがあるかconvert、ドキュメントに問題があるか、ドキュメントを正しく読んでいませんでした。

なにが問題ですか?この多数の画像ファイルのサイズを変更しながら、メモリ使用量を少なくするにはどうすればよいですか?

ところで:簡単な解決策は、シェルを使用してファイルをループし、ファイルconvertごとに個別に呼び出すことです。しかし、私は純粋なImageMagickで同じことを達成する方法を理解したいと思います。

ありがとう!

4

3 に答える 3

6

システムに直接アクセスできなければ、これをデバッグするのは非常に困難です。

しかし、この問題を絞り込むために、次の 3 つのことを行うことができます。

  1. 最初のコマンドライン引数として追加-monitorして、何が起こっているかについての詳細を確認してください。

  2. (オプション) 追加-debug all -log "domain: %d +++ event: %e +++ function: %f +++ line: %l +++ module: %m +++ processID: %p +++ realCPUtime: %r +++ wallclocktime: %t +++ userCPUtime: %u \n\r"

  3. 一時的に、'*.ppm[1280x1280]' を引数として使用せず、代わりに 'a*.ppm[1280x1280]' を使用してください。目的は、ワイルドカード展開 (または同じことを達成するための他の適切な方法) を、可能なすべての一致ではなく、少数の一致のみに制限することです。

「2.」の場合 「3」を行う必要があります。そうしないと、大量の出力に圧倒されることになります。(また、システムは、プロセスを強制終了することなく、とにかく完全なワイルドカードを処理できないようです...)

解決策が見つからない場合は...

  1. ...公式の ImageMagick バグ レポート フォーラムでユーザー名を登録します。
  2. ...そこに問題を報告して、彼らがあなたを助けることができるかどうか確認してください (丁寧に尋ねれば、これらの人はかなりフレンドリーで反応が良いです)。
于 2012-09-10T21:18:02.700 に答える
2

同じ問題が発生しました。これは、ImageMagick が一時ファイルを /tmp ディレクトリに作成することが原因のようです。これは多くの場合、tmpfs としてマウントされます。

tmp を別の場所に移動するだけです。

例えば:

  • 大きな外付けドライブに「tmp」ディレクトリを作成します

    mkdir -m777 /media/huge_device/tmp

  • パーミッションが 777 に設定されていることを確認してください

    chmod 777 /media/huge_device/tmp

  • ルートとして、/tmp の代わりにマウントします

    mount -o bind /media/huge_device/tmp /tmp

注: TMP 環境変数を使用して同じトリックを実行できるはずです。

于 2013-09-27T16:50:55.163 に答える
1

12 コアの場合は、GNU Parallel を使用します。このようなもので、非常にうまく機能します。一度に 12 枚の画像しか処理しないため、出力ファイルの番号を保持しながら、最小限の RAM しか使用しません。

scene=0
for f in *.ppm; do
   echo "$f" $scene
   ((scene++))
done | parallel -j 12 --colsep ' ' --eta convert {1}[1280x1280] -scene {2} pngs/%05d.png

ノート

-sceneあなたの部分で出てくるシーンカウンターを設定できます%05d

--etaあなたの仕事がいつ完了するかを予測します(推定到着時間)。

-j 12一度に 12 個のジョブを並行して実行します。

于 2015-10-09T22:52:50.540 に答える