「最大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億行の実データテストで確認した「行数よりファイル容量が先に効く」という結論が、理論上の計算でもそのまま裏付けられた。
関連記事
- UwViewで51GB・8.9億行の実データ(OSM日本)を開いてみた — 「お詫び:2億行は嘘でした」
- UwView をGitHub公開 — Windows95時代の大容量テキストビューアを最大2億行・全OS対応にリニューアル
出典
- 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 にまとめています。
お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。誤記・不正確な情報がございましたら、コメント欄よりご指摘いただければ、確認のうえ修正いたします。


コメント