文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

ImageMagickで秒間どれくらい画像変換できるか

結構変換できるんですよ〜


f:id:treeapps:20180424102046p:plain

www.bunkei-programmer.net

前回ImageMagicのOpenMPオプションが危険な件についての問題を解消しました。
さて、今回はImageMagickは秒間何枚くらい画像変換できるか(できたか)について書きます。

環境

ハードウェア

CPU Xeon2.7GHz 4コア
MEM 4G
ストレージ SAS 500G

ソフトウェア

OS CentOS v6.4 64bit
ファイルシステム GlusterFS v3
ImageMagic v6.8
JDK 1.6

処理内容

  1. MySQLからデータを1000件select
  2. データ1件につき1スレッド割り当て(最大12スレッドを設定)
  3. 1スレッドにつき、サムネイル中とサムネイル小を生成。生成成功時は画像パスをDBに更新。
  4. 以降ループ。

javaからImageMagickを呼び出しています。

ImageMagickのオプション

サムネイル中は以下の通り。

convert -define jpeg:size=150x150 -resize 150x150 -thumbnail -quality 70  src.jpg dst.jpg

サムネイル小は以下の通り。

convert -define jpeg:size=65x65 -resize 65x65 -thumbnail -quality 70  src.jpg dst.jpg

変換元の画像は縦横最大で600pxで、全てjpgです。
元画像の縦横サイズは不定ですが、ImageMagickは賢いので、150x150でリサイズしてもアスペクト比を保ったままリサイズしてくれます。

結果

約10万枚の画像(1データにつきサムネイル中、サムネイル小の2種類)を25分で生成。
25 x 60 = 1500秒。100000 / 1500 = 66.66・・・
1秒間に66枚の画像が生成できました
やはりマルチスレッドの処理は強力ですね。スレッド数を20くらいにすればもっと捌けそうですが、12スレッドでload averageが一時的に30超えたので、止めたほうがいいでしょう。

よくImageMagickと比較されるImlib2ですが、色々面倒そうなので今回使わないでおきました。
https://docs.enlightenment.org/api/imlib2/html/
リサイズ時にアスペクト比を保持してくれないし、画質はImageMagickの方が上。機能もImageMagickの方が上。あまり調べてないですが、Imlib2ってbashから呼べるんでしょうか。imlib-rubyというrubyバインディングはあるんですが、bashかjavaはあるのかな。

試してない事

convertコマンドではなく、 mogrifyコマンドは使ってません。mogrifyは元画像を上書き変換してしまう代わりに、一括で効率よく変換できるとのこと。元画像が上書きされるので、複数の画像種別を変換する場合は、一旦元画像を画像種別数分コピーしないといけません。

例えばオリジナルの画像を残して10万枚の画像を2種類の画像変換したい場合、10万×2 = 20万画像をコピー -> mogrify×2 、という処理になります。
convertよりmogrifyの方が絶対速いと思いますが、事前のコピー処理が重い・遅いので、結局convertの方が速いと予想しています。
誰か検証した事が有る方は結果を是非教えて下さい。

ファイルコピーさえなんとかなれば、画像を複数グループに分けておいて、マルチスレッドで並列してmogrifyしたら物凄く速そうな気がしています。

ImageMagick逆引きコマンドリファレンス

ImageMagick逆引きコマンドリファレンス