Qpress: 究極の圧縮プログラム

* 本記事は個人的に書いたものであり、現職、前職とも関係ないことを、あらかじめお断りしておきます。

ここで紹介させていただくのは、私が開発した驚くべき圧縮性能を誇る可逆圧縮プログラム Qpress です。 この技術のポイントは、適切な圧縮手法を選択することにより、どんなファイルでも、サイズを縮小できることです。たとえすでに圧縮されたファイルであっても、圧縮することができます。言い換えると、このプログラムを繰り返し適用することで、どんなファイルでも、好みの大きさにまで縮めることができる、ということです。 この技術を使えば、ファイルサイズの問題に二度と悩まされることがなくなるのです。

これまで、数多い圧縮手法が提案されてきましたが、残念ながら、データの配列によっては圧縮できないケースがありました。たとえば、皆さんもよくご存知のことと思いますが、一度圧縮したファイルをもう一度圧縮しても、ふつうはファイルサイズを減らすことはできません。情報学の基本定理により、どんなファイルでもサイズを小さくすることができる可逆圧縮手法は存在しないことが簡単に証明できます。

しかし、ここにはひとつ隠れた前提があります。それは、すべてのファイルに対して、単一の圧縮手法を利用するということが仮定されていることです。もし、多数の圧縮手法のなかから、ファイルに適した圧縮手法を自動的に選択することを考えるならば、この前提を覆すことができます。そして、それは実際に実現可能なのです。

Qpress 圧縮プログラムの特徴は、なんと内蔵している257種類もの圧縮手法のなかから、入力ファイルに適した圧縮手法が自動的に選択されることです。また、これらの手法は注意深く選択されており、どのようなファイルであっても、ファイルサイズを削減できる圧縮手法が1つ以上あることが保障されています。

厳密にいえば、ひとつだけ例外があります。0バイトのファイルは、理論上、圧縮することが不可能です。 ですが、それ以外のファイルであれば、必ず圧縮によってサイズを減らすことができるのです。たとえ、Qpress で圧縮した後のファイルであっても、です。

と言われても、にわかには信じられないと思います。しかし、これは本当なのです。私は、このコンセプトを実証するためのプロトタイプをRubyスクリプトで実装しましたので、その実際の動作をお見せいたします。 まずは圧縮のテストのためのファイルを準備します。

$ ruby -e 'print "abc"*87' > test
$ cat test
abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc
$ cp test test-orig
$ ls -la test*
-rw-rw-r-- 1 t Users 261 Apr  1 00:01 test
-rw-rw-r-- 1 t Users 261 Apr  1 00:01 test-orig

まあ、圧縮しやすそうなファイルではありますが、最初のテストとしては十分でしょう。

これを Qpress で圧縮してみます。

$ ./Qpress.rb test
File written to test.gzQ (8 bytes)
$ ls -la test*
-rw-rw-r-- 1 t Users   8 Apr  1 00:02 test.gzQ
-rw-rw-r-- 1 t Users 261 Apr  1 00:01 test-orig

圧縮アルゴリズム gzQ が選択され、劇的に小さくなりました。しかし、前述のとおり、この圧縮後のファイルを、さらに圧縮することができます。

$ ./Qpress.rb test.gzQ
File written to test.gzQ.elQ (7 bytes)
$ ls -la test*
-rw-rw-r-- 1 t Users   7 Apr  1 00:02 test.gzQ.elQ
-rw-rw-r-- 1 t Users 261 Apr  1 00:01 test-orig

今度は elQ アルゴリズムが選択され、さらに小さくなりました。適切なアルゴリズムを選択することにより、必ず圧縮できるのです。

このファイルをさらに圧縮することも、もちろん可能です。

$ ./Qpress.rb test.gzQ.elQ
File written to test.gzQ.elQ.ahQ (6 bytes)
$ ls -la test*
-rw-rw-r-- 1 t Users   6 Apr  1 00:02 test.gzQ.elQ.ahQ
-rw-rw-r-- 1 t Users 261 Apr  1 00:01 test-orig

繰り返すことで、いくらでも圧縮できます。

$ ./Qpress.rb test.gzQ.elQ.ahQ
File written to test.gzQ.elQ.ahQ.agQ (5 bytes)
$ ./Qpress.rb test.gzQ.elQ.ahQ.agQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ (4 bytes)
$ ./Qpress.rb test.gzQ.elQ.ahQ.agQ.aeQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ.fcQ (3 bytes)
$ ./Qpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ (2 bytes)
$ ./Qpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ (1 bytes)
$ ./Qpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ.aiQ (0 bytes)
$ ls -la test*
-rw-rw-r-- 1 t Users   0 Apr  1 00:03 test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ.aiQ
-rw-rw-r-- 1 t Users 261 Apr  1 00:01 test-orig

ついに0バイトになってしまいました。 前述のとおり、0バイトのファイルは残念ながら圧縮できませんが、この制限についてはご理解いただけるものと思います。

$ ./Qpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ.aiQ
Zero-size file cannot be compressed.

しかし、本当に0バイトにまでなったファイルから、復元できるのでしょうか。 では展開してみましょう。

$ ./unQpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ.aiQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ (1 bytes)
$ ./unQpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ.pjQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ (2 bytes)
$ ./unQpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ.onQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ.fcQ (3 bytes)
$ ./unQpress.rb test.gzQ.elQ.ahQ.agQ.aeQ.fcQ
File written to test.gzQ.elQ.ahQ.agQ.aeQ (4 bytes)
$ ./unQpress.rb test.gzQ.elQ.ahQ.agQ.aeQ
File written to test.gzQ.elQ.ahQ.agQ (5 bytes)
$ ./unQpress.rb test.gzQ.elQ.ahQ.agQ
File written to test.gzQ.elQ.ahQ (6 bytes)
$ ./unQpress.rb test.gzQ.elQ.ahQ
File written to test.gzQ.elQ (7 bytes)
$ ./unQpress.rb test.gzQ.elQ
File written to test.gzQ (8 bytes)
$ ./unQpress.rb test.gzQ
File written to test (261 bytes)

できたファイルを見てみましょう。

$ ls -la test*
-rw-rw-r-- 1 t Users 261 Apr  1 00:04 test
-rw-rw-r-- 1 t Users 261 Apr  1 00:01 test-orig
$ cat test
abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc
$ cat test-orig
abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc
$ diff -s test test-orig
Files test and test-orig are identical

正しく展開できていることがわかります。

このようなすばらしい性能を誇る Qpress ですが、今回特別に、Qpress 圧縮アルゴリズムを実装した ruby スクリプトを皆様に配布したいと思います。下のリンクからダウンロードしていただければ幸いです。試していただければ、確かに上記のように動作することがわかるでしょう。最初は小さなファイルから試されることをお勧めします。スクリプトはプロトタイプ段階であり、また、仕組み上、メモリなど大量の計算リソースを消費するからです。

どんなファイルであっても、また繰り返し適用することで好きなだけ圧縮してサイズを削減できる Qpress が、データ爆発時代の救世主となりうることが理解していただけたと思います。 このような素晴らしい技術の存在を、ぜひ皆様のお知り合いの方にもお伝えいただければ幸いです。