[{"data":1,"prerenderedAt":301},["ShallowReactive",2],{"content-/book-import-batch-parallel":3,"all-pages-for-dir":299,"og-image-/book-import-batch-parallel":300},{"id":4,"title":5,"body":6,"category":280,"description":281,"extension":282,"meta":283,"navigation":248,"ogImage":284,"path":285,"project_name":286,"published":287,"publishedAt":288,"seo":289,"stem":290,"tags":291,"todo":284,"unpublished":287,"updatedAt":284,"__hash__":298},"pages/2026-06/2026-06-12/book-import-batch-parallel.md","書籍OCR取り込みをバッチ化して複数セッション並列で回す - キュー管理・GPUロック・AGENTS.md整備",{"type":7,"value":8,"toc":266},"minimark",[9,14,23,28,39,42,47,58,62,65,83,86,89,95,105,108,111,148,151,155,158,173,177,183,193,200,211,214,234,237],[10,11,13],"h1",{"id":12},"書籍ocr取り込みをバッチ化して複数セッション並列で回す","書籍OCR取り込みをバッチ化して複数セッション並列で回す",[15,16,17,18,22],"p",{},"書籍ナレッジベースへの取り込みを、1冊ずつ指示する運用から「キューを書いておけば勝手に消化される」運用に切り替えた日。午前中に手動で6冊取り込みながらパイプラインの精度を確かめ、午後には ",[19,20,21],"code",{},"/import-batch"," コマンドを新設して不動産カテゴリ8冊のうち5冊を全自動で流し込んだ。",[24,25,27],"h2",{"id":26},"午前-手動取り込みでパイプラインを温める","午前: 手動取り込みでパイプラインを温める",[15,29,30,31,34,35,38],{},"まず不動産登記の解説書（約490ページ）を ",[19,32,33],{},"/yomitoku"," で取り込んだ。OCRはGPUで約1.7秒/ページ、486ページで15〜20分。完了後に図49件をリネームし、453チャンクをDBに格納して、",[19,36,37],{},"/restructure-book"," で目次ベースのセクション統合をかけたら80チャンクまでまとまった。",[15,40,41],{},"続けて財務分析系の経営書1冊（126→48チャンク）、不動産投資の税金本と不動産の税金入門書の2冊、さらに不動産投資の融資対策本（248→48）と節税本（123→74）と、計6冊を直列で流した。途中で取り込みスクリプトのシグネチャが変わっていて（db_path引数が不要になっていた）一度エラーで止まったが、修正して再実行で通った。",[43,44,46],"h3",{"id":45},"_404で恥をかいたルート構成","404で恥をかいたルート構成",[15,48,49,50,53,54,57],{},"取り込み完了後に「内容を確認したいからアプリで開いて」と頼んだら、ブラウザに404が返ってきた。原因はURLの間違いで、このアプリには ",[19,51,52],{},"/books/\u003CbookId>"," という書籍トップのルートが存在せず、ページ番号付きの ",[19,55,56],{},"/books/\u003CbookId>/\u003Cpage>"," しかない。登記記録例の表がMarkdownテーブルとしてきちんと入っていることは、ページを開き直して確かめられた。",[24,59,61],{"id":60},"turso-dbの容量を確認する","Turso DBの容量を確認する",[15,63,64],{},"「今どれくらい入ってるのか」が気になってTurso DBの容量を調べさせた。CLIが未インストールだったのでSQLで直接集計。",[66,67,68,77,80],"ul",{},[69,70,71,72,76],"li",{},"全体: ",[73,74,75],"strong",{},"約98MB","（77冊・8,701チャンク）",[69,78,79],{},"本文テキスト自体は13.5MBだけ",[69,81,82],{},"容量の半分以上はFTS全文検索インデックスが占める",[15,84,85],{},"本文よりインデックスの方が重い、という入り方を初めて数字で見た。この調子なら容量はまだ気にしなくていい。",[24,87,88],{"id":88},"蔵書シェルフを起点に取り込み計画を立てる",[15,90,91,94],{},[19,92,93],{},"/shelf","（蔵書の棚ページ）を眺めていて、1冊ずつパスを指定して取り込む作業に飽きてきた。会計系・税金系・不動産系を中心に、レビュー4以上・レビュー件数5件以上でフィルターして、計画通りにバンバン入れて最初から全部リストラクチャー済みの状態にしておけばいい——という方針に切り替えた。",[15,96,97,98,101,102,104],{},"Chrome DevToolsでshelfのカテゴリ体系と評価分布を確認しつつ、DB側からも対象冊数を数えて、",[73,99,100],{},"コア＋経営系245冊","の取り込み計画に落とし込んだ。カテゴリごとに★順で並べ、",[19,103,21],{}," と言うだけで1セッション10〜15冊を全自動処理する体制になった。",[24,106,107],{"id":107},"複数セッション並列のための設計",[15,109,110],{},"ここで「複数セッションで同時に非同期で回すと、同じ本を重複して取り込むのでは」という問題に気づいた。対策として担当割りと着手マークの両方をコマンド定義に入れさせた。",[66,112,113,127,136,142],{},[69,114,115,118,119,122,123,126],{},[73,116,117],{},"キューは1枚のマークダウン",": ",[19,120,121],{},"memo/2026-06-12/import-queue.md","。各セッションが処理完了のたびにチェックボックスを ",[19,124,125],{},"[x]"," に更新するので、どのセッションから見ても残りが分かる",[69,128,129,118,132,135],{},[73,130,131],{},"担当カテゴリ制",[19,133,134],{},"/import-batch 不動産"," のようにカテゴリを引数で渡し、セッションごとに担当を分けて重複を物理的に避ける",[69,137,138,141],{},[73,139,140],{},"着手マーク",": 取りかかった本にはマークを付けてから処理する",[69,143,144,147],{},[73,145,146],{},"GPUロックファイル",": yomitoku OCRはGPU（VRAM 8GB）を1プロセスしか使えないので、OCRの同時実行を防ぐロックを入れる",[15,149,150],{},"並列化で一番の制約がモデルでもAPIでもなくローカルGPUのVRAMだった、というのがこの設計の面白いところ。",[24,152,154],{"id":153},"codexもパイプラインにjoinできるようagentsmdを整備","CodexもパイプラインにJoinできるようAGENTS.mdを整備",[15,156,157],{},"「これってOpenAIのCodexでもできるんでしたっけ？」と聞いたら、キューの仕組み（チェックボックス・着手マーク・GPUロックファイル）は単なるファイル編集とbashなので、Codex CLIでも同じプロトコルを守れるという答え。ツール非依存に設計してあったのが効いた。",[15,159,160,161,164,165,168,169,172],{},"そこでCodex用に ",[19,162,163],{},"AGENTS.md"," を作らせたら、実は既にAGENTS.mdが存在していて、しかも中身はCLAUDE.mdのコピーで ",[19,166,167],{},".claude/"," が ",[19,170,171],{},".Codex/"," に誤置換された壊れた状態だった。それを修正したうえでCodex固有のセクションを末尾に追記する形で整備した。",[24,174,176],{"id":175},"午後-import-batch-不動産-を実走","午後: /import-batch 不動産 を実走",[15,178,179,180,182],{},"午後に ",[19,181,134],{},"（担当8冊）を実行した。流れはパイプライン化されていて、1冊のOCRがGPUで走っている間に次の本のメタデータ判定を進め、OCRが終わった本の取込〜restructureはsubagentに委譲して、メインはすぐ次のOCRを開始する。",[184,185,191],"pre",{"className":186,"code":188,"language":189,"meta":190},[187],"language-text","OCR(No.n) 実行中\n  ├─ メタデータ判定(No.n+1) を並行\n  └─ 取込+restructure(No.n-1) を subagent に委譲\n","text","",[19,192,188],{"__ignoreMap":190},[15,194,195,196,199],{},"途中で処理が詰まった。コマンドの結果確認が進まなくなり、原因はおそらく",[73,197,198],{},"同時に動かしていたGPT Codexがリソースを食っていたこと","。Codex側を確認して「今うまくいってますか？」と声をかけたら復帰し、4冊目（448→115チャンク）が完了していた。",[15,201,202,203,206,207,210],{},"最後はOCR進行中の1冊（残り28ページ）の完了を待ってキリよく区切り、",[73,204,205],{},"8冊中5冊完了","のクリーンな停止状態で終了。進捗ログを ",[19,208,209],{},"memo/2026-06-12/import-batch-fudosan-progress.md"," に復帰プロンプト付きで保存してあったので、午後の別セッションでは「進捗メモを読んで続きを実行して」の一言で再開できた。",[24,212,213],{"id":213},"学び",[66,215,216,219,222,225,228,231],{},[69,217,218],{},"取り込みキューをマークダウン1枚にして「チェックボックス＋着手マーク＋担当割り」を入れるだけで、複数セッションの並列運用が成立する",[69,220,221],{},"並列化のボトルネックはGPU（VRAM 8GB・OCR 1プロセス制約）。ロックファイルで直列化する箇所を明示するのが先",[69,223,224],{},"パイプラインをツール非依存（ファイル編集とbashだけ）に設計しておくと、Codexのような別エージェントも同じプロトコルで参加できる",[69,226,227],{},"AGENTS.mdのような設定ファイルは「既にあるが壊れている」ことがある。作る前に既存を確認させてよかった",[69,229,230],{},"進捗ログに復帰プロンプトを埋め込んでおくと、セッションが切れても詰まっても一言で続きから走らせられる",[69,232,233],{},"FTS全文検索インデックスは本文テキストの数倍の容量を食う。容量見積もりはインデックス込みで考える",[24,235,236],{"id":236},"明日以降やること",[66,238,241,254,260],{"className":239},[240],"contains-task-list",[69,242,245,250,251,253],{"className":243},[244],"task-list-item",[246,247],"input",{"disabled":248,"type":249},true,"checkbox"," 不動産カテゴリの残り3冊を ",[19,252,21],{}," で消化する",[69,255,257,259],{"className":256},[244],[246,258],{"disabled":248,"type":249}," 会計系・税金系カテゴリのバッチを別セッションで並走させ、担当割りプロトコルが実際に重複なく回るか確かめる",[69,261,263,265],{"className":262},[244],[246,264],{"disabled":248,"type":249}," CodexセッションをAGENTS.md経由で1バッチ参加させて、GPUロックが守られるか検証する",{"title":190,"searchDepth":267,"depth":267,"links":268},2,[269,273,274,275,276,277,278,279],{"id":26,"depth":267,"text":27,"children":270},[271],{"id":45,"depth":272,"text":46},3,{"id":60,"depth":267,"text":61},{"id":88,"depth":267,"text":88},{"id":107,"depth":267,"text":107},{"id":153,"depth":267,"text":154},{"id":175,"depth":267,"text":176},{"id":213,"depth":267,"text":213},{"id":236,"depth":267,"text":236},"dev","yomitoku OCRとセクション統合の書籍取り込みパイプラインを/import-batchコマンドでバッチ化。取り込みキューのマークダウン1枚で複数セッションを並列運用し、Codexも参加できるようAGENTS.mdを整備した記録。","md",{},null,"/book-import-batch-parallel","book-knowledge-base",false,"2026-06-12T00:00:00.000Z",{"title":5,"description":281},"2026-06/2026-06-12/book-import-batch-parallel",[292,293,294,295,296,297],"書籍ナレッジベース","OCR","yomitoku","Turso","並列処理","バッチ処理","VKJvtDeLGEhU07kspUTUxOxZu-YNYzAvSL-dUtI2z3E",[],"https://log.eurekapu.com/og/blog/book-import-batch-parallel.png?v=2026-06-12T00%3A00%3A00.000Z&title=%E6%9B%B8%E7%B1%8DOCR%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF%E3%82%92%E3%83%90%E3%83%83%E3%83%81%E5%8C%96%E3%81%97%E3%81%A6%E8%A4%87%E6%95%B0%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E4%B8%A6%E5%88%97%E3%81%A7%E5%9B%9E%E3%81%99%20-%20%E3%82%AD%E3%83%A5%E3%83%BC%E7%AE%A1%E7%90%86%E3%83%BBGPU%E3%83%AD%E3%83%83%E3%82%AF%E3%83%BBAGENTS.md%E6%95%B4%E5%82%99&author=Kei%20Komatsu&sig=b85bd84f7680aac2",1782528852215]