読み終わったログをどこに置くか、という話の続きです。
gzip で固めると小さくなりますが、探すときは zgrep で全部展開しながら読むことになります。50GB のログなら、探すたびに 50GB を展開する。以前それを「圧縮保管と検索の両立」として書きましたが、当時は答えを持っていませんでした。
UwView Pro が作る .uwvz というファイルが、その答えになっていることに、CLI を作っていて気づきました。索引のつもりで作っていたものが、圧縮アーカイブとしても使えた、という話です。
.uwvz とは何か
UwView Pro で巨大ファイルを開くと、隣に .uwvz ができます。中身は行の索引と、圧縮したファイル本体です。2回目に開くときはこれを読むので、50GB でも0.1秒以下で開きます。
これまで「速く開くためのキャッシュ」として説明してきました。ただ、中にファイル本体が丸ごと入っているので、元ファイルが無くても中身は失われていません。
どれだけ小さくなるか — gzip と同じ大きさで、作るのは5倍速い
同じファイルを gzip -6・zip -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 で十分。探さないなら索引は要りません
- 流れているログ、他のツールと共有するログ → 対象外
ログの置き場所を「消す・残す・圧縮する」で整理した回の、「圧縮する」の選択肢が一つ増えた、と受け取ってください。
使っている道具
.uwvz は UwView Pro が作ります(Windows・macOS・Linux、1ライセンスで全OS。買い切り/月額。14日間の無料試用あり)。-extract での取り出しは無料機能で、Pro のライセンスは要りません。
数値はすべて当方環境での自社実測で、独立ベンチマークではありません。
リンク
- uvp コマンドを付けました — ripgrep と同じ答えを、10GBで7倍速く — CLI の全コマンドと、rg との実測
- gzipで固めたログ、zgrepで探す遅さに耐えられない — 圧縮保管と検索の両立 — この記事が答えようとした問い
- 読み終わったログの置き場所 — 消す・残す・圧縮するの判断基準
- 258GB・45億行を1ファイルで開く — 28.61GB の
.uwvzができた回

