結構変換できるんですよ〜
前回ImageMagicのOpenMPオプションが危険な件についての問題を解消しました。
さて、今回はImageMagickは秒間何枚くらい画像変換できるか(できたか)について書きます。
環境
ハードウェア
CPU | Xeon2.7GHz 4コア |
---|---|
MEM | 4G |
ストレージ | SAS 500G |
ソフトウェア
OS | CentOS v6.4 64bit |
---|---|
ファイルシステム | GlusterFS v3 |
ImageMagic | v6.8 |
JDK | 1.6 |
処理内容
- MySQLからデータを1000件select
- データ1件につき1スレッド割り当て(最大12スレッドを設定)
- 1スレッドにつき、サムネイル中とサムネイル小を生成。生成成功時は画像パスをDBに更新。
- 以降ループ。
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したら物凄く速そうな気がしています。

- 作者: クーガー株式会社,石井敦
- 出版社/メーカー: インプレス
- 発売日: 2008/11/28
- メディア: 大型本
- 購入: 4人 クリック: 89回
- この商品を含むブログ (8件) を見る