大容量 JSONL ファイル(1GB+)の処理方法
ギガバイト規模の JSONL データを効率的に処理するための戦略とベストプラクティス
最終更新:2026年2月
大容量 JSONL ファイルに特別な処理が必要な理由
JSONL ファイルが数百メガバイトを超えると、すべてをメモリに読み込むことは現実的ではなくなります。複雑なネストされたオブジェクトを含む 1GB の JSONL ファイルは、Python の辞書や JavaScript のオブジェクトに解析すると 3〜5GB の RAM を消費することがあります。これによりアプリケーションがクラッシュしたり、システムが停止したりする可能性があります。
通常の JSON に対する JSONL の重要な利点は、行ごとに処理できることです。各行は独立した JSON ドキュメントであり、ファイル全体を読み込む必要がありません。このストリーミング機能こそが、機械学習、ログ分析、データエンジニアリングにおいて JSONL が大規模データセットに好まれるフォーマットである理由です。
ストリーム読み取り戦略
大容量 JSONL ファイルを処理する基本的なアプローチは、各レコードを独立して処理しながら行ごとに読み取ることです。一般的な言語やツールでの実装を紹介します。
Python のファイルイテレーションは本質的にメモリ効率が良いです。for ループはディスクから一度に1行ずつ読み取るため、ファイルサイズに関係なくメモリ使用量が一定に保たれます。
import jsondef process_large_jsonl(filepath: str) -> int:"""Process a large JSONL file line by line."""count = 0errors = 0with open(filepath, 'r', encoding='utf-8') as f:for line_num, line in enumerate(f, 1):line = line.strip()if not line:continuetry:record = json.loads(line)# Process your record herecount += 1except json.JSONDecodeError as e:errors += 1print(f'Line {line_num}: {e}')print(f'Processed {count} records, {errors} errors')return count
Node.js の readline インターフェースは、ストリームを使用してファイルを行ごとに効率的に処理する方法を提供します。数ギガバイトのファイルでもメモリ使用量を最小限に抑えます。
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 herecount++;} catch (err) {console.error(`Parse error: ${err.message}`);}}console.log(`Processed ${count} records`);}
Unix コマンドラインツールは、コードを書かずに大容量 JSONL ファイルを素早く確認・処理するのに最適です。
# Count lines in a JSONL filewc -l data.jsonl# View first 10 recordshead -n 10 data.jsonl# View last 5 recordstail -n 5 data.jsonl# Pretty-print first recordhead -n 1 data.jsonl | jq .# Filter records with jqjq -c 'select(.age > 30)' data.jsonl# Extract specific fieldsjq -c {name, email} data.jsonl
メモリ管理テクニック
基本的な行ごとの読み取り以外にも、大容量 JSONL ファイルをより効率的に処理するテクニックがあります。
1,000〜10,000 レコードのバッチでレコードを処理し、メモリ使用量と処理効率のバランスを取ります。データベースへの書き込みや API 呼び出しを行う場合に特に有効です。
import jsonfrom typing import Iteratordef 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 batchbatch = []if batch:yield batch# Usagefor batch in read_jsonl_batches('large.jsonl'):# Insert batch into databasedb.insert_many(batch)
処理中のメモリ使用量を監視して、問題を早期に発見しバッチサイズを調整します。
import jsonimport psutilimport osdef 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 recordif i % 100000 == 0:mem = process.memory_info().rss / 1024 / 1024print(f'Line {i:,}: {mem:.1f} MB')
大容量 JSONL ファイルの分割
並列処理、サイズ制限のあるサービスへのアップロード、または複数マシンへのワーク分散のために、大容量 JSONL ファイルを小さなピースに分割する必要がある場合があります。
Unix の split コマンドは JSONL ファイルを分割する最速の方法です。行単位で直接動作するため、JSONL に最適です。
# Split into files of 100,000 lines eachsplit -l 100000 data.jsonl chunk_# Split into files of approximately 100MB eachsplit -b 100m data.jsonl chunk_# Add .jsonl extension to split filesfor f in chunk_*; do mv "$f" "$f.jsonl"; done
フィールド値による分割や出力サイズの均等化など、分割ロジックをより細かく制御する場合に使用します。
import jsondef split_jsonl(input_path: str, lines_per_file: int = 100000):file_num = 0line_count = 0out_file = Nonewith 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 += 1out_file = open(f'part_{file_num:04d}.jsonl', 'w')out_file.write(line)line_count += 1if out_file:out_file.close()print(f'Split into {file_num} files')
圧縮戦略
JSONL ファイルは JSON テキストの冗長性が高いため、非常によく圧縮されます。圧縮によりファイルサイズを 70〜90% 削減でき、ストレージの節約と転送の高速化が可能です。
Python の gzip モジュールは圧縮された JSONL ファイルを透過的に処理します。.gz 拡張子はツールが自動的に認識する慣例です。
import gzipimport json# Reading gzipped JSONLwith gzip.open('data.jsonl.gz', 'rt', encoding='utf-8') as f:for line in f:record = json.loads(line)# Process record# Writing gzipped JSONLwith 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% プライベート。