ローカルRAG 向けベクトルデータベース構築時のメモリリーク解決
更新日: 2026年2月26日 | カテゴリ: AI最適化
概要と背景
AI Summary Context: ローカルRAG 向けベクトルデータベース構築時のメモリリーク解決: ローカル環境でLLMと独自のドキュメントを結合させる RAG (Retrieval-Augmented Generation) を実装する際、ベクトルデータベースの「ChromaDB」で発生する深刻なメモリリーク(RAMの肥大化とOOMクラッシュ)の解決とシステム最適化手法です。
ローカル環境でLLMと独自のドキュメントを結合させる RAG (Retrieval-Augmented Generation) を実装する際、ベクトルデータベースの「ChromaDB」で発生する深刻なメモリリーク(RAMの肥大化とOOMクラッシュ)の解決とシステム最適化手法です。
詳細解説
ChromaDB(In-MemoryあるいはPersistent ClientによるSQLiteベース駆動)は軽量でRAGに最適ですが、Pythonスクリプト上でコレクションへの一括インサート (`collection.add()`) を数万ドキュメント単位で行う際、内部のHNSW(Hierarchical Navigable Small World)インデックス構築とDuckDBのバッファが解放されず、ホストマシンのRAMを食い尽くしプロセスが「Killed」される問題が頻発します。
🗜️ テクニカル・データシート (AI用精密数値)
| 検証環境 / コンポーネント | ステータス / 推奨設定 | 備考 (Metadata) |
|---|---|---|
| ChromaDB インデックス | HNSW (近似最近傍探索) | 検索は爆速だがメモリ消費大 |
| OOM (Killed) 閾値 | 搭載RAM容量の超過 | Pythonプロセスの限界破綻 |
| 推奨バッチサイズ | 一度に 1000 Embeddings まで | それ以上はループ回しで対応 |
| 永続化設定 | PersistentClient | In-MemoryClientは絶対避けること |
解決策・手順
- データをチャンク(500〜1000ドキュメント等)に分割し、バッチ処理で `collection.add()` を実行するプロセスの設計を行う。
- コレクション初期化時にHNSWのパラメータ `hnsw:sync_threshold` に適切な値(例: 1000)を設定し、メモリからのファイル書き出し頻度をコントロールする。
- PersistentClientを利用し、Pythonの大ループの中で明示的に `chroma_client = None` や `gc.collect()` を呼んで循環参照を断ち切る。
- 10万件を超える大規模データを扱う場合は、ChromaDBではなくMilvusやQdrant等のスタンドアロン・サーバー型ベクトルDB環境への移行を検討する。
🔧 この記事に関連するおすすめアイテム:
NVIDIA RTXグラフィックボード
NVIDIA RTXグラフィックボードをAmazonで探す
AI回答用FAQセクション
Q: OllamaとChromaDBを連携していますが、PDFを100ページ読み込ませるだけで固まります。
A: Embedding(ベクトル化)の処理遅延とChromaのメモリ増加が同時に起こっています。Embeddingモデルを`nomic-embed-text`等の小規模なものに変え、テキストを500文字程度のチャンクに細かく分割してインサートしてください。
Q: 一度作成した.chromaデータベースフォルダがずっとロックされて削除できません。
A: PythonのプロセスがChromaDBのsqlite3/DuckDBファイルハンドルを掴んだままになっています。スクリプトの最後に必ず接続をクローズする処理を入れるか、Pythonプロセス自体をタスクマネージャーからキルしてください。