ブラウザはどれくらいの JSON ファイルを扱えるか
要点:固定の限界はなく、制約はタブのメモリ予算です。20MB のファイルは通常パース後に 60〜100MB になり、ハイライトされた DOM はさらに倍にできます。

要点:固定の天井はありません。メモリから見積もりましょう。パース後のオブジェクトは通常テキストサイズの 3〜5 倍かかり、ハイライトされた DOM がさらに倍にします。50MB を超える、またはトップレベルのレコード数が数十万に達するなら、スライス、ストリーミング、ローカルアプリへの切り替えを行い、タブに無理に押し込まないでください。
メモリはどこへ行くか
20MB の JSON テキストは三度存在します。
- 生の文字列:20MB
- パース後のオブジェクトグラフ:通常 60〜100MB(重複した文字列、オブジェクトヘッダー、ハッシュテーブル)
- ハイライトされた DOM:トークンごとに 1 ノードで、軽くさらに 2 倍
エディタのバッファ、アンドゥスタック、シンタックスハイライトのキャッシュは追加です。「20MB のファイル」が常駐 200MB を超えられます。
経験則
| サイズ | デスクトップ | モバイル |
|---|---|---|
| < 5MB | 滑らか | 滑らか |
| 5〜20MB | わずかな遅延、整形に 1〜3 秒 | 明らかな遅延、固まる可能性 |
| 20〜50MB | 動くが重い。ハイライトを切る | クラッシュしがち |
| > 50MB | 推奨しない | 使えない |
これらはデバイス、ブラウザのバージョン、ハイライトの有無で変わります。保証ではなく桁感として使ってください。
RAM を増やしても直らない理由
タブには厳格な上限があり、超えると優雅な劣化ではなく即座のクラッシュです。モバイルはさらに厳しく、数百 MB の下位で回収します。
大きなファイルを扱う
スライスする。
head -c 1048576 big.json | jq .
jq '.items[0:100]' big.json
ストリーミングする。 stream-json、ijson、jq --stream はレコードごとに処理し、メモリがファイルサイズに依存しません。
ローカルアプリを使う。 タブの制限がなく、マシンのメモリ全体を使えます。デスクトップ版ダウンロード。
形式を変える。 ログとイベントストリームは最初から NDJSON にすべきです。1 行 1 レコードで、構造上ストリーミング可能です。
バックエンドに削らせる。 UI が三つのフィールドを必要とするなら、三百を送るのはブラウザの制限ではなく API 設計の問題です。
ファイルを測る
ls -lh data.json
jq 'length' data.json
length が数十万なら、バイト数に関係なくページネーションかストリーミングが答えです。
FAQ
自分のファイルがどのサイズ帯かを見分けるには?
ls -lh でバイトを、jq 'length' でトップレベルのレコード数を確認します。数 MB 未満はどこでも滑らか、20〜50MB はデスクトップで動くがカクつき、50MB を超えたらストリーミングかコマンドラインツールを使うべきです。
50MB を超えるファイルはどうすべきですか?
head -c でスライスするか、jq、stream-json、jq --stream でストリーミングし、メモリをファイルサイズから独立させます。文書全体を検査する必要があるなら、タブのメモリ予算に縛られないデスクトップアプリを使ってください。ログとイベントストリームはそもそも NDJSON に属します。