258.68GB・45億行を開く — アメリカ全土のOpenStreetMapをXML展開してUwView Proで実測した

技術解説

先日、日本全域を切り出した3.16GB・1億行のXML で、ネイティブ版とブラウザ版の速度差を測りました。あのとき正直、こう思っていました。「1億行では、まだ本気を出していない」と。

UwView は「巨大ファイルを、いつでも瞬時に」を掲げているアプリです。掲げている以上、掲げどおりに壊れないかを、自分で確かめておく必要があります。そこで用意したのが、アメリカ全土のOpenStreetMapでした。


テストデータ:258.68GB の単一XMLファイル

OpenStreetMap のアメリカ全土データ(PBF形式・約11GB)を、osmium cat でXMLに展開しました。約15分かかって出てきたのが、これです。

us-260726.osm
258,679,440,228 byte  =  258.68 GB(240.9 GiB)

ls -lh では「241G」と表示されます。これは GiB 表記なので、同じファイルの別の書き方です。分割していない、1本のXMLファイルです。

なぜこんなものを作ったかというと、「巨大」と言えるファイルは意外と手に入らないからです。ログは普通はローテートされますし、ダンプは分割されます。分割されていない、テラバイト手前の1ファイル——ビューアを本気で殴るには、自分で作るのが一番早い、という結論でした。


実測結果(macOS 実機・UwView Pro)

項目 実測値 条件
初回オープン(索引作成の完了まで) 5分28秒(328秒) 258.68GB を全走査 = 約 789 MB/s
2回目以降のオープン 一瞬 .uwvz サイドカーあり(UwView Pro)
総行数 4,509,830,821 行(45億行) 索引完了後に確定
全文検索「New York」 34.8秒 / 100,492件ヒット 索引完了後
全文検索「Boston」 約34秒 索引完了後
.uwvz サイドカーのサイズ 28.61 GB(28,608,409,551 byte) 元データの約1/9

計測はy4u(開発者本人)が Mac 実機で行った画面操作ベースの実測です。秒単位の精度で、ストップウォッチによる計測を含みます。


索引を作っている「最中」から、末尾まで読める

まず見てほしいのがこの画面です。

索引作成中(10%)でもOSM XMLの中身が表示されているUwView Proの画面

タブには us-260726.osm 10%、ステータスバーには「索引中」の進捗バーとキャンセルボタンが出ています。つまりまだ索引は1割しかできていない。それでも、本文には <relation><member type="way" ref="..."> がちゃんと表示され、スクロールもできます。

これが UwView のページモード即時オープンです。ファイル全体を読み込まずに、「見えている範囲だけ」を読んで描く。だから 258.68GB でも、選んだ瞬間から中身が出ます。索引はその裏側で進み、完成したら行番号が付く、という順番です。

多くのビューアは索引が終わるまで先頭しか見えません。5分28秒のあいだ、先頭だけを眺めて待つか、それとももう本文を読み始められるか。この差は、実際に困っているときほど効きます。

なお、この段階では行番号の欄(ガター)がまだ空です。行番号は索引完成後に付く——これは仕様どおりで、隠さずに書いておきます。


45億行という数字

索引が完了した後の画面がこちらです。

行モードで末尾までジャンプし、総行数4,509,830,821行と最終行のosm閉じタグが表示されている画面

ステータスバーに「行モード|総行数 4,509,830,821・先頭 4,509,830,795 行目」。末尾までジャンプして、最終行の </osm> がちゃんと見えています。

45億行。行番号の桁が10桁になると、さすがに見ていて少し笑いました。ここまで来ても、ジャンプは一瞬です。行モードに入ってしまえば、あとは索引が仕事をしてくれるので、ファイルの大きさは体感に効いてきません。


検索は「語に関係なく約34秒」で一定だった

いちばん面白かったのが検索です。

「New York」で検索し、フィルタ結果ウィンドウに100,492件が前後±1行の文脈付きで表示されている画面

「New York」で 100,492件フィルタ結果ウィンドウに、前後±1行の文脈と行番号を付けて並んでいます。<tag k="operator" v="New York City Transit Authority"/><tag k="owner" v="City of New York"/> といった、いかにもOSMらしい行が拾えました。

この検索が 34.8秒。そして「Boston」で検索しても 約34秒でした。ヒット数はまったく違うのに、時間はほぼ同じです。

つまり UwView の全文検索は、ヒット件数ではなく、走査するデータ量で時間が決まるということです。これは実務では地味に嬉しい性質で、「珍しい語だから速いはず」「よくある語だから遅いはず」という当てずっぽうが要りません。どんな語を投げても約34秒と分かっていれば、コーヒーを淹れに行くかどうかを迷わずに決められます。

原ファイルの258.68GBを34秒で舐めた計算にすると約7.6GB/s になりますが、これは見かけの数字です。UwView Pro の検索は保存済みの圧縮キャッシュ(28.61GB)を経由するので、実際に読んでいるデータ量はもっと小さい。「SSDが7.6GB/s出た」という話ではない、という点は正直に書いておきます。


サイドカーは28.61GB — 元データの約1/9

UwView Pro は、初回オープンで作った索引と圧縮データを .uwvz というサイドカーファイルに保存します。今回は 28.61 GB(28,608,409,551 byte)でした。元の258.68GBに対して約1/9です。

この28.61GBがあるおかげで、2回目以降のオープンは一瞬になります。5分28秒が、ゼロになる。テラバイト手前でも、この価値提案は壊れませんでした。

そして1/9という数字は、保管の話でもあります。258.68GBのXMLを取っておく代わりに、28.61GBのサイドカーを取っておいて、必要なときにそのまま開いて検索する——という運用ができます。ストレージを専有している巨大ログに対して、UwView Pro が提案しているのはこの形です。


正直な注記

  • すべて macOS 実機・単一ファイルでの実測です。マシン構成やストレージが変われば数字は動きます。
  • 初回の 5分28秒 は短縮できません。 258.68GBを一度は全部読む必要があるからです。UwView が主張しているのは「初回が最速」ではなく、「初回オープン中でも読める」と「2回目以降は行番号付きで瞬時」の2点です。
  • 検索結果が瞬時に返るのは索引完了後です。索引作成中の閲覧はできますが、全文検索の完走には索引が要ります。
  • 2回目以降の「一瞬」は UwView Pro の機能です。無料版の UwView(UVF)はサイドカーを保存しないため、開くたびに索引をバックグラウンドで作り直します(ただし、閲覧と検索は同じように初回から可能です)。
  • 検索時間の 34.8秒 / 約34秒 は、それぞれ1回の実測値です。複数回の平均ではありません。
  • 「約789MB/s」「約7.6GB/s」は、ファイルサイズを所要時間で割った換算値であり、ストレージのベンチマーク値ではありません。

まとめ

258.68GB・45億行という、たぶん実務では滅多に出てこないサイズで確かめたかったのは、性能の自慢ではなく、設計の主張が壊れないかどうかでした。

  • 索引作成中でも、開いた瞬間から全体を閲覧・スクロールできた(画面1)
  • 45億行でも、末尾へのジャンプは一瞬だった(画面2)
  • 検索は語に依らず約34秒で一定、10万件のヒットも文脈付きで並んだ(画面3)
  • サイドカー28.61GB(約1/9)を保存し、2回目以降のオープンは一瞬になった

「巨大ファイルを、いつでも瞬時に」——テラバイト手前でも、この言い方を変えずに済みました。

UwView は無料で使えます。大きなログやダンプを触る方は、まずはお手元のいちばん大きいファイルで試してみてください。壊れたら、ぜひ教えてください。


関連記事

出典

  • amru195704/UwView(GitHub) https://github.com/amru195704/UwView
  • OpenStreetMap contributors(データ・ODbL) https://www.openstreetmap.org/copyright
  • Geofabrik Download Server(OSM抽出データ配布) https://download.geofabrik.de/
  • osmium-tool(PBF→XML 展開に使用) https://osmcode.org/osmium-tool/

UwView Pro(発売中・全OS対応:Windows/macOS/Linux)

「巨大ファイルをいつでも瞬時に表示・検索、索引を保存して2回目以降は行番号付きで瞬時に開く・検索が最大約9倍・ログを約1/9で保管してそのまま開ける」商用版です。買い切り $129 / 月額 $9。
→ https://uvp.y42u.net/pro/


開発者より: アプリ・Kindle本・オープンソースの一覧は GitHub: amru195704 にまとめています。


お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。機能・数値は各時点の確認で、今後のアップデートで変わる可能性があります。誤記・不正確な情報がございましたら、コメント欄よりご指摘いただければ、確認のうえ修正いたします。

コメント

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