gzip の代わりに .uwvz で置いておく — 1/9 に縮んで、7秒で探せて、無料で元に戻せる

技術解説

読み終わったログをどこに置くか、という話の続きです。

gzip で固めると小さくなりますが、探すときは zgrep で全部展開しながら読むことになります。50GB のログなら、探すたびに 50GB を展開する。以前それを「圧縮保管と検索の両立」として書きましたが、当時は答えを持っていませんでした。

UwView Pro が作る .uwvz というファイルが、その答えになっていることに、CLI を作っていて気づきました。索引のつもりで作っていたものが、圧縮アーカイブとしても使えた、という話です。

.uwvz とは何か

UwView Pro で巨大ファイルを開くと、隣に .uwvz ができます。中身は行の索引と、圧縮したファイル本体です。2回目に開くときはこれを読むので、50GB でも0.1秒以下で開きます。

これまで「速く開くためのキャッシュ」として説明してきました。ただ、中にファイル本体が丸ごと入っているので、元ファイルが無くても中身は失われていません。

どれだけ小さくなるか — gzip と同じ大きさで、作るのは5倍速い

同じファイルを gzip -6zip -6.uwvz で固めて、大きさと時間を並べました。

元ファイル gzip -6 zip -6 .uwvz
3.03GB 0.30GB(16.8秒) 0.30GB(19.4秒) 0.25GB(1.2秒)
10.26GB 1.12GB(66.5秒) 1.12GB(76.8秒) 1.16GB(14.9秒
51.25GB 5.75GB(347.2秒) 5.76GB(394.7秒) 5.74GB(65.0秒

比で書くと、3GB は gzip 1/10.1・zip 1/10.1・.uwvz 1/12.0、10GB は 1/9.2・1/9.2・1/8.8、50GB は 1/8.9・1/8.9・1/8.9 です(ディスク上の実サイズから計算)。大きさは gzip とほぼ同じです。50GB で gzip が 1/8.91、.uwvz が 1/8.93。ここに差はありません。

違うのは作る時間で、50GB を gzip は 5分47秒、.uwvz は 1分5秒——5倍速い。索引を作りながら圧縮しているのに、gzip より速く終わります。

258GB のアメリカ全土でも .uwvz は 28.61GB(1/9.0)でした。OpenStreetMap の XML での数字なので、ログでは違う値になるはずですが、桁の感覚はこれです。

元ファイルを消しても、探せる

ここが本題です。

uvp japan.osm.uwvz '東京'            # 元ファイル(51GB)は消してある。.uwvz だけで検索

元ファイルが無くても、.uwvz を直接指定して検索できます。 出てくる行は、元ファイルを検索したときと同じです。

gzip や zip で保管したファイルを探すには、まず戻す必要があります。戻して、それから rg で探す——その合計と、.uwvz を直接探す時間を並べます。

サイズ gzip(解凍+rg) zip(解凍+rg) .uwvz を直接検索
3GB 6.47秒(3.49+2.98) 8.71秒(8.08+0.63) 0.68秒
10GB 24.70秒(13.12+11.58) 40.48秒(29.28+11.20) 1.74秒
50GB 120.67秒(65.05+55.62) 203.06秒(146.97+56.09) 7.21秒

50GB で gzip は2分、zip は3分半、.uwvz は7秒。gzip の 17倍です。

理由は単純で、gzip は探すたびに全部戻すのに対し、.uwvz索引を持っているので戻さずに探せるからです。しかも 2問目・3問目も 7秒のまま。gzip は戻したファイルを残しておけば2問目からは rg の55秒ですが、それでは圧縮した意味がありません。

なお zgrep を使えば戻したファイルをディスクに書かずに済みますが、解凍そのものは省けないので、時間の桁は変わりません(この記事では zgrep は測っていません)。

保管と検索が、同じファイルで済みます。

uvp で使える絞り込み・正規表現・頻度集計も、そのまま .uwvz に対して使えます(コマンドの一覧はこちら)。

元に戻せる。しかも無料で

圧縮したものは、戻せなければ保管に使えません。

uvp japan.osm.uwvz -extract -out ./restored/

-extract で、元ファイルをそのまま取り出せます。 3GB のファイルで試したところ、3.38秒で、元ファイルとバイト単位で一致しました。同じ 3GB を gzip -dc で戻すと 3.49秒なので、戻す速さは gzip と同じです。

そしてこの取り出しは無料機能です。Pro のライセンスが切れても、.uwvz の中身は取り出せます。戻せないファイル形式で保管することにはなりません。

作るのにかかる時間

サイズ .uwvz を作る時間(2回の計測)
3GB 1.1〜1.2秒
10GB 11.8〜14.9秒
50GB 59.6〜65.0秒

およそ 1〜1.3秒/GB(Mac M4・外付け USB SSD)。UwView Pro で「開く」時間と同じです——同じものを作っているので。gzip -6 の 5分47秒(50GB)より速いのは、上に書いたとおりです。

向かないもの

正直に書いておきます。

  • 流れ続けているログには向きません。 .uwvz は作った時点の中身を固めたものです。追記されるファイルは、追記が終わってから作ってください
  • UwView 専用の形式です。 gzip のように、他のツールでそのまま開けるものではありません。他の人に渡すなら -extract で戻すか、gzip にしてください
  • 目的に特化した形式には敵いません。 同じ50GBの OpenStreetMap を専用バイナリの PBF にすると 2.46GB(1/20.8)で、gzip や .uwvz の半分以下です。.uwvz は「どんなテキストでも」の汎用圧縮で、専用形式と競うものではありません
  • -extract は 3GB でしか測っていません。10GB・50GB の取り出し時間は未計測です
  • gzip との比較は「解凍してから rg」で測っています。zgrep で流す方法は測っていません(解凍の時間は同じなので、結論は変わらないと考えています)

使い分け

  • 読み終わったが、たまに探す必要があるログ.uwvz で保管。gzip と同じ大きさで、探すのは秒
  • もう二度と見ないログ → gzip で十分。探さないなら索引は要りません
  • 流れているログ、他のツールと共有するログ → 対象外

ログの置き場所を「消す・残す・圧縮する」で整理した回の、「圧縮する」の選択肢が一つ増えた、と受け取ってください。

使っている道具

.uwvzUwView Pro が作ります(Windows・macOS・Linux、1ライセンスで全OS。買い切り/月額。14日間の無料試用あり)。-extract での取り出しは無料機能で、Pro のライセンスは要りません。

数値はすべて当方環境での自社実測で、独立ベンチマークではありません。

リンク

タイトルとURLをコピーしました