8.9億行を開いたテキストビューアは、理論上どこまで開けるのか?

技術解説

「最大2億行」とうたっていた自作の大容量テキストビューア「UwView」で、先日OpenStreetMap日本全域をXML化した51GB・約8.9億行のファイルが問題なく開けたことを確認しました。総行数はwc -lと1行の狂いもなく一致し、末尾(8.9億行目)へのジャンプは0.006msでした。

そこでふと思いました。理論上は何行まで開けるのか? 気になったので、自分のコードの型と構造から上限を順に計算してみます。

リポジトリ: amru195704/UwView(PolyForm Internal Use License 1.0.0)


まず結論:型の上限は約920京行

UwViewは行番号もバイトオフセットも符号付き64bit整数(.NETのlongで通しています。したがって型としての天井は次の値です。

long.MaxValue = 9,223,372,036,854,775,807 (≈ 9.2×10^18 行 = 約920京行)

すでに現実味がない桁ですが、話はここで終わりません。実際にはこの手前に壁が順番に現れます。


壁① ファイルサイズ

バイトオフセットもlongなので、扱えるファイルは最大約8 EiB(エクスビバイト)です。しかも1行の最小は改行1バイト(\n)だけなので、「行数の上限」と「ファイルサイズの上限」はどちらも8 EiB級でほぼ一致します。もちろん現実には、その手前でファイルシステム側の最大ファイルサイズ(ext4は16TB/ファイル、APFSやNTFSは数EBなど)が先に効きます。


壁② 索引の構造

UwViewは省メモリのために「N行ごとに1個だけバイト位置を記録する」スパース索引を使っています(既定値 N=256)。このチェックポイントはList<long>——内部的には配列——で保持していますが、.NETの配列要素数の上限は約21.4億(Int32.MaxValueです。

つまり既定設定では、次の行数で索引配列が頭打ちになります。

21.4億 × 256 ≒ 5.5×10^11 行(約5,500億行)

これはblockLines(N)を大きくすれば緩和できる設計ですが、そもそも索引のメモリが先に効いてきます。索引サイズは「行数 ÷ 256 × 8バイト」で概算でき、実測記事では8.9億行で26.6MBでした。この比率で5,500億行まで伸ばすと、索引だけで約17GBのRAMが必要になり、実効的にはこの辺りが現実の上限になります。


壁③ 本当の壁は「容量」

整理すると、次の3段構えになります。

段階 上限 実際に効くか
型としての上限 約9.2×10^18行(約920京行) 事実上到達不能
構造上の実効上限 既定で約5,500億行(設定変更で拡張可) 索引RAMが先に律速
実務上の本当の壁 ストレージ容量 ここが現実的な上限

8.9億行のテストで一番効いたのも、まさに「行数よりファイル容量が先に効く」という点でした。51GBがキャッシュに載りきらず、ランダム読みはミリ秒級に落ちる——でも破綻はしません。ファイル本体を常駐させず(mmap)、可視行だけ描画し、行位置は小さなスパース索引で引く、という設計の素直な帰結です。


で、実際の限界は?

型上限の9.2×10^18行に触れるには8 EiB級のファイルが必要になるので、人類が普通に用意できるストレージでは到達できません。現実的には「用意できる一番大きいファイル=ビューアの限界」ということになります。

もし手元に極端に大きいテキスト(数百GB〜TB級)をお持ちの方がいたら、ぜひUwViewで開いて限界を調べて教えていただけると嬉しいです。


まとめ

  • UwViewの行番号・バイトオフセットは64bit整数(long)で、型としての上限は約920京行だが事実上到達不能。
  • 実際にはその手前で、スパース索引の配列要素数上限(既定で約5,500億行)や索引メモリが先に効く。
  • 索引の壁を越えても、最終的に効くのはストレージ容量というシンプルな現実。
  • 8.9億行の実データテストで確認した「行数よりファイル容量が先に効く」という結論が、理論上の計算でもそのまま裏付けられた。

関連記事

出典

  • amru195704/UwView(GitHub) https://github.com/amru195704/UwView
  • Int64.MaxValue プロパティ(.NET) https://learn.microsoft.com/dotnet/api/system.int64.maxvalue
  • Array クラスの上限(.NET) https://learn.microsoft.com/dotnet/api/system.array

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

「巨大ファイルをいつでも瞬時に表示・検索、索引を保存して2回目以降は行番号付きで瞬時に開く・検索が最大約9倍・ログを約1/9で保管してそのまま開ける」商用版です。買い切り $129 / 月額 $9。
→ https://uvp.y42u.net/pro/
(UwView / UwView Pro は、初回でも開いた瞬間からファイル全体を閲覧・検索できます。索引はバックグラウンドで作成し、完成後に行番号を表示。UwView Pro は索引と圧縮を保存するので、2回目以降は行番号付きで瞬時に開けます。他ツールは索引が終わるまで先頭しか見えませんが、UwView は1回目から全体を瞬時に閲覧・検索できます)


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


お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。誤記・不正確な情報がございましたら、コメント欄よりご指摘いただければ、確認のうえ修正いたします。

コメント

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