はじめに
docling で大容量 PDF を Markdown に変換しようとしたら、内部エラーでクラッシュしました。
数千ページ規模のPDFを変換する場合は、メモリとのトレードオフで簡単にはいかないようです。
分割方式で、解消できることがわかりましたので、その手法を記録しておきます。
対象者
- docling で大量ページの PDF を変換したい人
- メモリ 16GB 程度の環境で大容量の PDF を扱いたい人
- RAG のデータ前処理で大量ドキュメントを変換する必要がある人
環境
- WSL2 Ubuntu 20.04.3 LTS
- メモリ 16GB + swap 4GB
- Python 3.13
全体の流れ
1. OCR を無効化
2. ページ分割(バッチ)方式に変更
最初は docling convert --to md をそのまま実行しました。
RapidOCR モデルが読み込まれ、処理が重くメモリ消費が大きくなりました。
監視結果(hoge.pdf 処理中):
| 時刻 | Python RSS | 空きメモリ |
|---|---|---|
| 09:05 | 5.4 GB | 9.1 GB |
| 09:14 | 9.7 GB | 4.9 GB |
| 09:21 | 12.4 GB | 2.3 GB ← OOM寸前 |
根本原因: docling は PDF の全ページを一度にメモリへ展開する。数千ページ規模の PDF ではページ数に比例してメモリを消費し、16GB を使い切ってクラッシュに至る。
Step 1: OCR を無効化
テキスト主体の PDF なので、OCR は不要と判断しました。
--no-ocr は画像化されたページに対する OCR 処理(RapidOCR によるテキスト抽出)をスキップするオプションです。すでにテキストレイヤーを持つ PDF であれば OCR は不要なため、このオプションを付けるだけでモデル読み込みと画像解析のコストを丸ごと省けます。
docling --no-ocr sample.pdf
これだけでメモリ消費と処理時間が大幅に改善しますが、巨大 PDF では依然としてメモリ枯渇が発生するため、次の Step が必要です。
Step 2: ページ分割(バッチ)方式に変更
200ページ単位で変換 → Markdown を逐次追記 → チャンクごとにメモリを解放する方式に変更しました。
処理速度:
- 200ページあたり 約250〜340秒(初回バッチのみモデル初期化で長め)
- CPUでのレイアウト解析+表構造解析がボトルネック
ページ分割(バッチ)方式に変更することによりクラッシュせずに、変換することができました。
| ファイル | ページ数 | 出力サイズ | 行数 |
|---|---|---|---|
| hoge.pdf | 3,200 | 5.58 MB | 118,676 |
| fuga.pdf | 8,117 | 12.33 MB | 354,825 |
- 総所要: 約5時間(品質優先=レイアウト+表構造解析あり)
まとめ
大容量 PDF の変換でメモリが枯渇する場合は、まず OCR の要否を検討してみてください。
- docling は全ページをメモリ展開するため大容量 PDF でクラッシュする
- テキスト主体の PDF なら
--no-ocrで高速化できる - 200ページ単位のバッチ変換に分割することでメモリ枯渇を回避できる
今回使ったスクリプトを 参考までにgithubにcommitしています。
ご興味のある方は以下からどうぞ。
chunked_convert.py