大容量 JSONL ファイル(1GB+)の処理方法

ギガバイト規模の JSONL データを効率的に処理するための戦略とベストプラクティス

最終更新:2026年2月

大容量 JSONL ファイルに特別な処理が必要な理由

JSONL ファイルが数百メガバイトを超えると、すべてをメモリに読み込むことは現実的ではなくなります。複雑なネストされたオブジェクトを含む 1GB の JSONL ファイルは、Python の辞書や JavaScript のオブジェクトに解析すると 3〜5GB の RAM を消費することがあります。これによりアプリケーションがクラッシュしたり、システムが停止したりする可能性があります。

通常の JSON に対する JSONL の重要な利点は、行ごとに処理できることです。各行は独立した JSON ドキュメントであり、ファイル全体を読み込む必要がありません。このストリーミング機能こそが、機械学習、ログ分析、データエンジニアリングにおいて JSONL が大規模データセットに好まれるフォーマットである理由です。

ストリーム読み取り戦略

大容量 JSONL ファイルを処理する基本的なアプローチは、各レコードを独立して処理しながら行ごとに読み取ることです。一般的な言語やツールでの実装を紹介します。

Python のファイルイテレーションは本質的にメモリ効率が良いです。for ループはディスクから一度に1行ずつ読み取るため、ファイルサイズに関係なくメモリ使用量が一定に保たれます。

Python
import json
def process_large_jsonl(filepath: str) -> int:
"""Process a large JSONL file line by line."""
count = 0
errors = 0
with open(filepath, 'r', encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
record = json.loads(line)
# Process your record here
count += 1
except json.JSONDecodeError as e:
errors += 1
print(f'Line {line_num}: {e}')
print(f'Processed {count} records, {errors} errors')
return count

Node.js の readline インターフェースは、ストリームを使用してファイルを行ごとに効率的に処理する方法を提供します。数ギガバイトのファイルでもメモリ使用量を最小限に抑えます。

Node.js
import { createReadStream } from 'fs';
import { createInterface } from 'readline';
async function processLargeJsonl(filepath) {
const rl = createInterface({
input: createReadStream(filepath, 'utf-8'),
crlfDelay: Infinity,
});
let count = 0;
for await (const line of rl) {
const trimmed = line.trim();
if (!trimmed) continue;
try {
const record = JSON.parse(trimmed);
// Process your record here
count++;
} catch (err) {
console.error(`Parse error: ${err.message}`);
}
}
console.log(`Processed ${count} records`);
}

Unix コマンドラインツールは、コードを書かずに大容量 JSONL ファイルを素早く確認・処理するのに最適です。

コマンドラインツール
# Count lines in a JSONL file
wc -l data.jsonl
# View first 10 records
head -n 10 data.jsonl
# View last 5 records
tail -n 5 data.jsonl
# Pretty-print first record
head -n 1 data.jsonl | jq .
# Filter records with jq
jq -c 'select(.age > 30)' data.jsonl
# Extract specific fields
jq -c {name, email} data.jsonl

メモリ管理テクニック

基本的な行ごとの読み取り以外にも、大容量 JSONL ファイルをより効率的に処理するテクニックがあります。

1,000〜10,000 レコードのバッチでレコードを処理し、メモリ使用量と処理効率のバランスを取ります。データベースへの書き込みや API 呼び出しを行う場合に特に有効です。

バッチ処理
import json
from typing import Iterator
def read_jsonl_batches(
filepath: str,
batch_size: int = 5000
) -> Iterator[list]:
batch = []
with open(filepath, 'r') as f:
for line in f:
record = json.loads(line.strip())
batch.append(record)
if len(batch) >= batch_size:
yield batch
batch = []
if batch:
yield batch
# Usage
for batch in read_jsonl_batches('large.jsonl'):
# Insert batch into database
db.insert_many(batch)

処理中のメモリ使用量を監視して、問題を早期に発見しバッチサイズを調整します。

メモリ監視
import json
import psutil
import os
def process_with_monitoring(filepath: str):
process = psutil.Process(os.getpid())
with open(filepath, 'r') as f:
for i, line in enumerate(f):
record = json.loads(line)
# Process record
if i % 100000 == 0:
mem = process.memory_info().rss / 1024 / 1024
print(f'Line {i:,}: {mem:.1f} MB')

大容量 JSONL ファイルの分割

並列処理、サイズ制限のあるサービスへのアップロード、または複数マシンへのワーク分散のために、大容量 JSONL ファイルを小さなピースに分割する必要がある場合があります。

Unix の split コマンドは JSONL ファイルを分割する最速の方法です。行単位で直接動作するため、JSONL に最適です。

split コマンドの使用
# Split into files of 100,000 lines each
split -l 100000 data.jsonl chunk_
# Split into files of approximately 100MB each
split -b 100m data.jsonl chunk_
# Add .jsonl extension to split files
for f in chunk_*; do mv "$f" "$f.jsonl"; done

フィールド値による分割や出力サイズの均等化など、分割ロジックをより細かく制御する場合に使用します。

Python スクリプト
import json
def split_jsonl(input_path: str, lines_per_file: int = 100000):
file_num = 0
line_count = 0
out_file = None
with open(input_path, 'r') as f:
for line in f:
if line_count % lines_per_file == 0:
if out_file:
out_file.close()
file_num += 1
out_file = open(f'part_{file_num:04d}.jsonl', 'w')
out_file.write(line)
line_count += 1
if out_file:
out_file.close()
print(f'Split into {file_num} files')

圧縮戦略

JSONL ファイルは JSON テキストの冗長性が高いため、非常によく圧縮されます。圧縮によりファイルサイズを 70〜90% 削減でき、ストレージの節約と転送の高速化が可能です。

Python の gzip モジュールは圧縮された JSONL ファイルを透過的に処理します。.gz 拡張子はツールが自動的に認識する慣例です。

gzip 圧縮 JSONL の読み書き
import gzip
import json
# Reading gzipped JSONL
with gzip.open('data.jsonl.gz', 'rt', encoding='utf-8') as f:
for line in f:
record = json.loads(line)
# Process record
# Writing gzipped JSONL
with gzip.open('output.jsonl.gz', 'wt', encoding='utf-8') as f:
for record in records:
f.write(json.dumps(record) + '\n')

圧縮比較

混合データを含む 1GB JSONL ファイルの一般的な圧縮率:

gzip:70〜80% 削減(1GB → 200〜300MB)、広くサポートされている

zstd:75〜85% 削減(1GB → 150〜250MB)、解凍が高速

lz4:60〜70% 削減(1GB → 300〜400MB)、最速の速度

圧縮なし:最速のアクセス、頻繁なランダム読み取りに最適

ブラウザでの大容量ファイル処理

jsonl.co は、1GB 以上の JSONL ファイルをブラウザで直接処理できるように設計されています。ストリーミングと Web Workers を使用して、サーバーにアップロードすることなくファイルをローカルで処理します。

つまり、データはプライベートに保たれ、アップロードを待たずに即座に結果が得られます。ビューアは仮想スクロールで数百万レコードを表示でき、すべての変換ツールが大容量ファイル向けのストリーミングをサポートしています。

無料 JSONL ツールを試す

大容量 JSONL ファイルの表示、検証、変換をブラウザで直接実行。アップロード不要、ファイルサイズ制限なし、100% プライベート。

大容量 JSONL ファイルをオンラインで処理

最大 1GB の JSONL ファイルをブラウザで表示、検証、変換。アップロード不要、100% プライベート。

よくある質問

大容量 JSONL ファイル(1GB+) — ストリーミング・分割・圧縮 | jsonl.co