2014-02-27

LZ4 の近況を確認してみる

Posted on 2014-02-27, 23:11

lz4-ruby の開発を進めるために、LZ4 の近況を確認してみたところ、 それなりに活発に開発されているようで変更点が多かったため、メモを兼ねてエントリにまとめてみました。

r76 から r113 までの変更履歴を追う形で、主だった変更を列挙していきます。

API が増えた

r76 の時点ではマクロを含めて 6 個だった API が、r113 では obsolete を除いても 36 個と大幅に増えました。

LZ4 の基本機能は以前とはそう変わらないものの、後述するストリーム処理用 API など、 利用シーンごとに適した API を拡充しているようです。

liblz4 が作成されるようになった

r111 より。

以前の LZ4 は Makefile はあれど make してもライブラリは生成されず、 そのためアプリケーションから LZ4 の圧縮・伸長機能を利用しようとすると、 アプリケーションのビルド時に lz4.c などをあわせてコンパイルし、 同ソースコードのオブジェクトファイルをリンクする必要がありました。

この方法では LZ4 のリビジョンをアップデートしてアプリケーションを 再ビルドする手順がちょっと複雑になるデメリットがありましたが、 r111 で更新された Makefile によって、ライブラリ liblz4.a / liblz4.so が生成されるようになり、この問題は多少緩和されたのではないかと思います。

ただ、make install でのライブラリ / ヘッダファイルのインストールには 対応しているものの、 yum やら apt-get でインストールできるわけではないので、 依存パッケージの自動的な解決などはまだ期待できません。

ストリーミング処理に対応した

r102 より。

以前の LZ4 では、圧縮したい単位で圧縮対象のデータを API に渡し、また圧縮後のデータを記録する ヒープを十分に割り当てした上でAPI を呼び出す必要がありました。 この API 構成は zlib などの API とは大きく異なり、利用ケースによっては使い辛いこともあったようです。 (圧縮・伸長の時間性能を稼ぐためには仕方のない API 設計ではあったのですが…)

r102 で導入されたストリーム処理の API によって、ストリーミング的な圧縮処理を実現することができるようになりました。 (詳しい利用方法などは確認中です…)

LZ4 HC の圧縮レベルを指定できるようになった

r113 より。

LZ4 には、時間的な圧縮処理性能を犠牲にしつつ、空間効率的によりよい (= 圧縮率を重視した) 結果を得るためのモード、 LZ4 HC が存在します。

直近のリビジョンである r113 にて、この LZ4 HC に「圧縮レベル」パラメータが追加され、 圧縮率と処理時間のトレードオフのバランスを開発者がチューニングできるようになりました。

圧縮・伸長の時間効率がさらに向上した

LZ4 の一番の特徴である高速な圧縮・伸長処理は継続的に改善されているようです。 特にプラットフォームやコンパイラごとの細かな最適化がなされている印象です。

まとめ

更新履歴 を見るとそれなりに開発が継続されているようですし、 イシュー を見てもまだやるべきことは残されているようなので、今後も開発は継続されていくことでしょう。まだまだ要注目ですね!

0 コメント:

コメントを投稿