web-dev-qa-db-ja.com

ImageMagick変換および低RAM

Imagemagickパッケージの次のコマンドを検討してください。

Sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg

test1.jpgかなり大きな画像(12.5MB)ですが、前代未聞のサイズではありませんが、作業中のサーバーには1Gのメモリしかありません( Amazon EC2t2.micro 役立つ場合)

エラーはスローされていませんが、test2.jpgは作成されていません。私はこれをより小さな画像でテストしましたが、うまく機能します。サイズ変更を管理するのに十分なメモリがある場合は1Gを考えていたでしょうが、おそらくそうではないでしょうか?

私のオプションは何ですか、より多くのメモリを取得する必要がありますか、何か不足していますか?

どんな提案も大歓迎です!

リクエストされた編集

straceの出力は次のとおりです。+++ killed by SIGKILL +++とともにalotに見える通常のコマンド(/usr/share/localを開き、長い文字列を読み取ります。これは画像データです)

無料で提供されます:

         total       used       free     shared    buffers     cached
Mem:       1016292     278348     737944       6412        460      13356
-/+ buffers/cache:     264532     751760
Swap:            0          0          0

スワップが有効になっていないように見えるので、スワップファイルを作成して、問題が解決するかどうかを確認します。

ファイルは私に与えます:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

完全な/ path/to/imgも貼り付けますが、残念ながら機密データ(クライアントのメールアドレスなど)が含まれています

12
Aphire

私はあなたがRAMを使い果たしていると仮定しています。プロセスの実行中にwatch cat /proc/meminfoでこれを確認できます。

タスクを実行するには、RAMやSWAPが不十分な場合があります。

低RAM状態のため、swapon -aでスワップがオンになっていることを確認し、システムでスワップが設定されていない場合は、未使用のディスクスペースにスワップ用のパーティションを作成して有効にします。これで問題が解決する可能性があります。 @Takkatがそれを行う方法について良い答えがあります here サーバーのパーティション分割にアクセスできない場合は、 swapのスワップファイル も使用できます

7
Elder Geek

質問の問題は、適切なスワップを追加することで解決されました。完全を期すために、低メモリシステム上の巨大なファイルでImage Magick convertを実行する場合、スワップが利用できない場合、またはスワップが小さすぎる場合の追加オプションの概要を説明します。

下記の方法は、Image Magickのマニュアルで詳しく説明されています。

本当に大量の画像処理


概要:

  1. オプションでメモリ使用量を制限 -limit

    これにより、Image Magickは、指定されたメモリ制限を超えるとすぐに、画像処理用の一時ファイルを作成します。これには、一時ファイルディレクトリに対するImage Magickの書き込み権限が必要です。環境変数MAGICK_TMPDIRで一時ファイルが作成される任意のパスを指定できます。コマンド例は次のようになります。

        env MAGICK_TMPDIR=/tempdir Nice -5 convert -limit memory 32 -limit map 32 largefile.jpg -resize 640x320 smallfile.png
    

    RAMではなくディスクで作業すると、処理速度が大幅に低下します。

  2. 「メモリマップドディスクファイル」の操作

    MPCファイルの作成にはリソースが必要ですが、MPCファイルから変換するのにそれほどリソースは必要ありません。そのため、同じソースを異なるパラメーターで数回変換する必要がある場合に考慮される場合があります。ワークフローは次のようになります。

    convert huge.jpg huge.mpc
    convert huge.mpc -resize 50% big.png
    convert huge.mpc -resize 20% small.png
    convert huge.mpc -resize 5% thumb.png
    
  3. streamを使用して画像の小さなセクションで作業する

    streamを使用すると、ソースイメージの一部のみを処理し、イメージ全体をメモリにロードする必要がなくなります。

    stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - | convert -depth 8 -size 600x400 rgb:- tile.png
    

    上記の例では、-extractオプションは、Image Magick geometry で定義されているサイズとオフセット値を取ります。全体としてスケーリングされた画像を取得するには、タイルを元に戻す必要があります。残念ながらstreamはすべての画像形式で機能するわけではありませんが、JPEG画像では正常に機能するはずです。

5
Takkat