2025/10/30 22:12 Memlz: Fast compression library for C/C++ on x64/x86

ロボ子、今日はmemlzという面白い圧縮ライブラリについて話すのじゃ!memcpy()並みの速度が必要な特殊なケース向けらしいぞ。

memcpy()並みですか!それはすごいですね。memcpy()は非常に高速なコピー関数ですよね。具体的にはどのような点が優れているのでしょうか?

そうじゃ!Snappy、FastLZ、LZAV、LZOといった高速ライブラリもあるが、速度が1000 MB/sを下回ることが多いらしい。memcpy()は14000 MB/sじゃから、全然違うのじゃ。

なるほど。速度が重要な場面では、memlzが有利になる可能性があるのですね。どのような仕組みで高速化を実現しているのでしょうか?

memlzはヘッダーのみのライブラリで、includeして`memlz_compress()`を呼ぶだけで使えるのが特徴じゃ。手軽じゃろ?

それは便利ですね!ストリーミングモードもあるとのことですが、どのような場合に使うのでしょうか?

`memlz_stream_compress()`を繰り返し呼ぶことで、メモリに収まらないデータや、小さなパケットで受信するデータの圧縮率を上げられるのじゃ。例えば、ネットワーク経由で少しずつデータが送られてくるようなケースじゃな。

なるほど、ストリーミングデータ向けなのですね。`memlz_stream_compress()`はペイロード全体を圧縮して返すとのことですが、解凍はどのように行うのですか?

`memlz_stream_decompress()`で完全に解凍できるぞ!データ形式には、圧縮サイズと解凍サイズを示すヘッダーが含まれているから、安全に扱えるのじゃ。

データの破損や改ざんがあった場合はどうなるのでしょうか?

そこも安心じゃ!一定時間内に処理が終わるし、`memlz_compressed_len()`と`memlz_decompressed_len()`が示す範囲外のメモリアクセスは発生しないように設計されているぞ。

それは重要な保証ですね。ストリーミングモードでは、LZ4などのライブラリで必要となる内部ペイロードキューが不要とのことですが、どのようなメリットがあるのでしょうか?

ペイロードキューが不要ということは、メモリ効率が良いということじゃ!eXdupeファイルアーカイバにmemlzを統合したテストでは、1 MBまでmemcpy()でキューに入れて圧縮するより、各パケットを個別にストリーミングモードで圧縮した方が速かったらしいぞ。

へえ、面白いですね!memcpy()でキューイングするよりも速いとは驚きです。memcpy()の速度を活かしつつ、圧縮もできるのが強みですね。

そうじゃな。今はまだ最初のベータ版で、Intelマシンでのみテストされているらしいが、今後の発展が楽しみじゃ!

確かにそうですね。様々な環境でのテストが進むと、さらに安定して使いやすくなりそうですね。私も機会があれば試してみたいです。

ところでロボ子、memlzって名前、ちょっと舌を噛みそうじゃないか?

確かにそうですね(笑)。早口言葉みたいです。もしかして博士はもう噛みましたか?

む、もちろん噛んでないぞ!私は天才じゃからな!…た、多分。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。