Java におけるデータ圧縮とそのライブラリ事情について #jjug_ccc 2018 Spring でお話しました

いまの仕事とはまったく関係ない内容で JJUG CCC 2018 Spring でお話してきました。

発表資料

※ 発表で使用したスライドより、本質的ではないスライドは省いています。

振り返り

CfP を投げるときに何を血迷ったか 20 分枠で応募してしまったがために、時間的な制約によって深い・細かい話は一切できずに代表的な圧縮アルゴリズムのざっくり説明とその Java 向けライブラリの紹介、そしてちょっとした比較に終始してしまいました。これでは、発表タイトルにある「極める」とは程遠い内容だな… と反省するばかりです。

なお、Java そのものからはちょっとずれた「データ圧縮」というテーマ設定での発表ではありましたが、ご回答いただいたアンケートで

  • もう少しロジックに踏み込んだ話が聞きたかった。

という声があったり、Twitter 上でも

というコメントを頂いたりとアルゴリズムの方に興味を持っている方が少なからずいらっしゃるようなので、後日にはなるけどもうちょっと詳しい内容を何回かに分けてブログエントリを書こうかな… と思ってます。

そのほかアンケートで寄せられたコメントを取り上げます。

  • 自分で調べると時間かかってしまう分野なので、シンプルにまとまっていて、良かったです。聞きにくいこともありませんでした。java ならではのマルチスレッド(マルチコアの有効活用)という点での踏み込みがあるとさらに良かったと思います(どれもあまり変わらないのでしょうか。。。)

こちらですが、今回の発表で紹介した圧縮ライブラリについてはいずれもシングルスレッドでのみの圧縮 / 復元の処理となります (マルチスレッド処理はいずれもサポートしていません)。そのため、一つの巨大なファイルを圧縮 / 復元するようなケースではマルチコアの有効活用は難しいと言えるでしょう。1

一方で、それなりの大きさのファイルが大量にあるようなケースであれば、それぞれの処理をスレッドプールなどを用意して同時並列で行うことで、マルチコアを有効活用した処理はわりと容易に実現できると考えています。

あとどうでもいいことなんですが、「Java な人たちにはこのスライドややウケするかな?」と思って仕込んだ某ネタスライドが思いのほか好評 (?) で笑いどころか拍手が沸き起こったのはいい思い出になりました。

あわせて読みたいブログエントリ

今回の JJUG CCC に関する、会社および同僚のブログエントリです。あわせてご覧ください。


  1. Java の外の世界には pigz のように、gzip-compatible なマルチコア向け実装が存在しているわけなので、原理的にはこの pigz のように「固定長サイズで入力をブロックに区切って、それぞれのブロックを同時並列で圧縮する」みたいなことはできるでしょう。ただそれをサポートしている圧縮ライブラリが存在するかというと存在しないわけなので、現時点ではネイティブライブラリの low-level API を叩きながら自前実装で頑張ることになりますが。