Dropbox謹製のロスレスjpeg圧縮ツールleptonはどれくらい空き容量を確保できるのか
目次
こんにちは。
開発チームのワイルド担当、まんだいです。
Dropboxが開発したJPEGファイルのロスレス圧縮ツール、leptonを使って、実際のところどれくらい画像サイズを圧縮できるのか、色々試してみました。
今回利用したOSはCentOS7で、VirtualBox上に作成しています。
Windowsのシステム情報とVirtualBox上の割り当ては以下のキャプチャを御覧ください。
同じ環境を作って簡単に試してみたい方は、こちらの記事を参考に、仮想環境を構築してみてください。
コンパイル環境を選ぶので、CentOS6以下では、うまくコンパイルできない可能性が高いので要注意です。
(実際、CentOS6.7のVMでは、色々手は尽くしたもののコンパイルできませんでした。)
leptonのインストール
leptonのインストールは非常に簡単です。
githubにも書いてある通り、付属のautogen.shを実行して、ビルドに使う依存モジュールをダウンロードした後、autoreconfを使ってビルド環境を構築します。
autogen.sh でコケる場合は、automakeとautoconfをyumでインストールしてみてください。
git clone https://github.com/dropbox/lepton.git sh autogen.sh ./configure make -j4 sudo make install
マルチコアでmakeした方が断然速いので、makeの際は「-j」オプションは付けたほうがいいです。
4コアCPUのPCでmakeしたものが上記のコマンドになります。
CPUのコア数は、nprocコマンドで取得できるので、「make -j$(nproc)」みたいな事も可能っちゃ可能です(ワイルドですね!)。
どれくらいの削減ができるか
それでは、お待ちかねのコンバートタイムのお時間です。
まずはコイツを料理してみましょう。
ファイルサイズは、5816548バイト。5MB強ですね。JPEG画像としては、まぁ大きい方だと思います。
これをlepton形式にコンバートするコマンドは、以下のような形になります。
time lepton IMGP2319.JPG compressed.lep lepton v1.0-1.2.1-35-ge230990 14816784 bytes needed to decompress this file 4349164 5816548 74.77% 15946404 bytes needed to decompress this file 4349164 5816548 74.77% real 0m1.102s user 0m2.676s sys 0m0.053s
timeコマンドは実行時間が知りたいから付けただけなので、本来は「lepton IMGP2319.JPG compressed.lep」だけでいいです。
74.77%のサイズに圧縮できたという結果になります。
lsの結果は以下のようになります。
ls -al -rw-rw-r--. 1 vagrant vagrant 5816548 10月 11 09:33 IMGP2319.JPG -rw-------. 1 vagrant vagrant 4349164 10月 11 09:49 compressed.lep
概ね問題なく処理できていると思います。
では、もとに戻してみます。
time lepton compressed.lep decompressed.jpg lepton v1.0-1.2.1-35-ge230990 15946404 bytes needed to decompress this file 4349164 5816548 74.77% real 0m0.370s user 0m1.235s sys 0m0.022s ls -al -rw-rw-r--. 1 vagrant vagrant 5816548 10月 11 09:33 IMGP2319.JPG -rw-------. 1 vagrant vagrant 4349164 10月 11 09:52 compressed.lep -rw-------. 1 vagrant vagrant 5816548 10月 11 09:54 decompressed.jpg
元画像がIMGP2319.JPG、lepton形式にコンバート後、jpegに再コンバートした結果が「decompressed.jpg」になります。
ファイルサイズも同じ、diffをとっても全く同じファイルという事になっています。
ただ、パーミッションが変わっているのには、要注意ですね。
大量の画像をコンバートしてみる(jpeg → lepフォーマット)
大量に画像をコンバートしてみて、平均的にどれくらい容量削減できるか、調査してみました。
まずは、jpegからlepフォーマット。
leptonがさばいたファイル数は159ファイルで、総バイト数は807MBでした。
これをleptonのコンバートに掛かった時間は、合計で569.686秒で、平均3.582931秒掛かっています。
ファイルサイズは合計826028バイトのjpegファイルを627912バイトのlepフォーマットのファイルにコンバートしています。
平均圧縮率は23.98%で、公称22%なので、公称どおりの結果ですね。
最も圧縮率がよいファイルで29.58%の圧縮に成功しています。
逆に圧縮率が最も悪いファイルで21.23%となっています。
中央値は23.82%なので、平均的に22%以上は圧縮できていると考えていいと思います(よね?)
ちなみに、CPU負荷は各コアに分散されて実行されているようで、1つのCPUだけが使用率が高いという状況にはなっていませんでした。
大量の画像をコンバートしてみる(lepフォーマット → jpeg)
続いて、lepフォーマットからjpegへのコンバートに試してみます。
先ほどコンバートしたlepフォーマットファイルをjpegに戻してみます。
こちらのコンバートにかかった時間は、合計で232.158秒で、平均1.460113秒掛かっています。
こちらもファイルによってまちまちですが、最大で1.992秒掛かっているものもあれば
最小で1.246秒掛かっているものもあります。
実行時間の中央値は1.436秒でした。
締め
jpeg画像がガンガン保存されるようなサービスで、AWSのS3などに保存するタイミングでコンバートしておけば、節約になりそうです。
ただ、圧縮、復元に掛かるマシンパワーも割とバカになりません。
掛かる時間は、コンバートなので、CPUの性能はもちろん、メモリの使用量にも大いに依存するので、マシンにあった調整をする必要があります。
メモリ周りやプロセス、スレッド周りはオプションで制御する事ができます。
ただ、見逃せない機能として、Unixドメインソケットを経由したり、リッスンするポートを指定してファイルを取得するよう、起動させるような使い方もできるようです。
leptonのコンバートサーバーを別途立てて、ひたすらコンバートさせるような使い方も想定しているのか、アイデア次第で光るかも知れません。
leptonはDropboxの内部では、既に実用化されていて、成果を上げているようです。
これを機に、jpeg画像のファイル容量でお困りの方は試してみてはいかがでしょうか。
以上です。