[{"data":1,"prerenderedAt":370},["ShallowReactive",2],{"content-/pdf-textbook-yomitoku-batch-pipeline":3,"all-pages-for-dir":368,"og-image-/pdf-textbook-yomitoku-batch-pipeline":369},{"id":4,"title":5,"body":6,"category":349,"description":350,"extension":351,"meta":352,"navigation":318,"ogImage":353,"path":354,"project_name":355,"published":356,"publishedAt":357,"seo":358,"stem":359,"tags":360,"todo":353,"unpublished":356,"updatedAt":353,"__hash__":367},"pages/2026-06/2026-06-24/pdf-textbook-yomitoku-batch-pipeline.md","PDF専門書をyomitokuで並列OCR取り込みした話 — 朝の6冊バッチから夜の専門書追走まで",{"type":7,"value":8,"toc":333},"minimark",[9,13,18,23,31,34,45,48,52,63,69,73,76,83,87,94,116,119,123,126,138,141,145,148,244,247,250,253,264,271,274,303,307],[10,11,12],"p",{},"裁断した専門書PDFを yomitoku で OCR にかけ、Turso DB まで投入するパイプラインを、朝と夜で計25冊くらい流した日。\n朝は前日の積み残しを含めて6冊を一気通貫で処理。夜はその定型を流用して、未取り込みのPDF専門書を「レビュー数の多い順」で上から19冊ほど取り込んだ。",[14,15,17],"h2",{"id":16},"朝のセッション-6冊バッチで定型ワークフローを確立","朝のセッション — 6冊バッチで定型ワークフローを確立",[19,20,22],"h3",{"id":21},"ocr-バックグラウンド起動-db-投入-restructure-4-並列","OCR バックグラウンド起動 → DB 投入 → restructure 4 並列",[10,24,25,26,30],{},"朝の最初のステップは、撮影済み画像の OCR を ",[27,28,29],"strong",{},"バッチ化してバックグラウンドに投げる","こと。",[10,32,33],{},"Bash スクリプトで 4 冊分の yomitoku を順次実行する形にして、Task ツールでバックグラウンド起動。推定 24 分の見込みなので、その間は別作業に回せる。",[35,36,41],"pre",{"className":37,"code":39,"language":40},[38],"language-text","[OCR バッチ] → [DB 投入] → [restructure サブエージェント 4 並列]\n   24分前後       数秒/冊         並列で各 5〜10 分\n","text",[42,43,39],"code",{"__ignoreMap":44},"",[10,46,47],{},"OCR が完了したら DB 投入スクリプトを順次叩いて、4 冊で合計 983 chunks。\nそこから章節を再構成する restructure をサブエージェント 4 並列で起動した。\nここが今日いちばん時間を稼げたポイントで、最も重い1冊（章節構造が複雑な書籍）は単独だと時間がかかるが、軽い 3 冊を並走させることで体感の待ち時間が消えた。",[19,49,51],{"id":50},"サブエージェントの後出し-resultに気づいた","サブエージェントの「後出し result」に気づいた",[10,53,54,55,58,59,62],{},"restructure サブエージェントの結果ファイルが 2 件、メインに戻ってきていなかった。\n当初は「失敗したのか？」と疑ったが、DB の chunks 数を見ると ",[42,56,57],{},"195 → 94"," に減っていて、実体としては正しく動いている。履歴ファイルだけ自分の手で簡易補完を入れたら、しばらくして",[27,60,61],{},"サブエージェントから後出しで詳細結果が届いた","。\n章別セクション数・巨大チャンクの切り詰め（214,850 字 → 1,026 字）・ページペアリング戦略まで含む充実版が、メイン側のレスポンスから数分遅れて返ってきた形。\n簡易版を上書きさせる形で履歴ファイルを充実版に置き換えた。",[64,65,66],"blockquote",{},[10,67,68],{},"サブエージェントの結果は同期的に返ってくるとは限らない。chunks 数など DB 側の実態で先に判断して、後出し result が来たら上書きする運用が落ち着く。",[14,70,72],{"id":71},"やっぱ専門書がいいんですよ-夜セッションのフィルタ判断","「やっぱ専門書がいいんですよ」 — 夜セッションのフィルタ判断",[10,74,75],{},"夜は別セッションで PDF 書籍の取り込みに集中。Dropbox 配下に 1,225 冊の番号付き書籍があって、DB 取り込み済みが 234 冊、未取り込みが 629 冊あることが分かった。",[10,77,78,79,82],{},"最初は「ベストセラー教養書」が上位に並ぶリストが出てきたが、自分が DB に入れたいのは",[27,80,81],{},"実務で引きたい専門書","。\n「レビュー数が多い順で、専門書からやっていきたい」と方針を切り直してもらった。\n税務・会計・法律・IT・データ系の実務書に絞ると 116 冊が残り、その中でレビュー数の多い順から上から順に流していくことにした。",[19,84,86],{"id":85},"yomitoku-を独自スキル化してあるので起動コストがほぼゼロ","yomitoku を独自スキル化してあるので、起動コストがほぼゼロ",[10,88,89,90,93],{},"yomitoku は ",[42,91,92],{},"/yomitoku"," という独自スキルにしてあって、",[95,96,97,101,104,107,110,113],"ol",{},[98,99,100],"li",{},"PDF パスを確認",[98,102,103],{},"冒頭ページを読んで書籍情報を把握",[98,105,106],{},"yomitoku でバックグラウンド OCR",[98,108,109],{},"完了したら図リネーム",[98,111,112],{},"DB 投入（amazon_metadata 自動紐付け）",[98,114,115],{},"検索テスト",[10,117,118],{},"までを一連の流れとしてカプセル化してある。\n夜セッションでは「次の冊のパスを渡す」だけで、このスキルが自動で全ステップを進めてくれる。\n1冊あたり数百MBの大書も、人間がやることは「次これ」と決めるだけ。",[19,120,122],{"id":121},"並列起動の組み方-1冊ocr中に次冊のメタデータ準備","並列起動の組み方 — 1冊OCR中に次冊のメタデータ準備",[10,124,125],{},"yomitoku は GPU を占有するので、OCR は同時に 1 本しか走らない。\nだが「1冊のOCRが終わるまで完全に待つ」のはもったいないので、",[127,128,129,132],"ul",{},[98,130,131],{},"OCR 進行中: 次の冊のメタデータを Amazon から先取得",[98,133,134,135],{},"OCR 完了: そのままDB投入を回しつつ、",[27,136,137],{},"次の冊のOCRをすぐ起動",[10,139,140],{},"という二段重ねにした。1冊のDB投入（数十秒）の間に、次冊の OCR が走り始める形。\nこれで「OCR待ち時間中に人間が遊んでいる」状態をほぼ消せた。",[14,142,144],{"id":143},"_19冊取り込みの実体","19冊取り込みの実体",[10,146,147],{},"夜セッションで取り込めた専門書（書籍特定を避けて book_id ベースで件数のみ）:",[149,150,151,170],"table",{},[152,153,154],"thead",{},[155,156,157,161,164,167],"tr",{},[158,159,160],"th",{},"順",[158,162,163],{},"サイズ",[158,165,166],{},"処理時間",[158,168,169],{},"chunks",[171,172,173,188,202,216,230],"tbody",{},[155,174,175,179,182,185],{},[176,177,178],"td",{},"1",[176,180,181],{},"79MB",[176,183,184],{},"4分27秒",[176,186,187],{},"253",[155,189,190,193,196,199],{},[176,191,192],{},"2",[176,194,195],{},"54MB",[176,197,198],{},"3分11秒",[176,200,201],{},"190",[155,203,204,207,210,213],{},[176,205,206],{},"3",[176,208,209],{},"95MB",[176,211,212],{},"11分18秒",[176,214,215],{},"278",[155,217,218,221,224,227],{},[176,219,220],{},"4",[176,222,223],{},"中型",[176,225,226],{},"2分04秒",[176,228,229],{},"161",[155,231,232,235,238,241],{},[176,233,234],{},"5〜19",[176,236,237],{},"様々",[176,239,240],{},"〜10分",[176,242,243],{},"145〜517",[10,245,246],{},"合計 4,751 chunks 追加。最大の1冊で 517 chunks（38グループ統合）。\n途中、ディレクトリ名に日本語が混じっていて yomitoku が文字化けで失敗するケースがあったので、英字パスにコピーして再実行した。リトライ前提でパイプラインを設計しておくと心が穏やかになる。",[14,248,249],{"id":249},"ペースコントロールは人間側の仕事",[10,251,252],{},"セッション中、何度か自分から介入してペースを調整した:",[127,254,255,258,261],{},[98,256,257],{},"「これ今進行中ってことで合ってますよね」と進行確認",[98,259,260],{},"「次の10件を出してください」で先のロードマップを可視化",[98,262,263],{},"「いいきりのいいところでおしまい」で安全停止",[10,265,266,267,270],{},"特に最後の「キリのいいところで止める」は重要で、大書（723ページ分まで OCR 済み）が進行中だったが、中途半端な状態を残さないために ",[27,268,269],{},"OCR を明示的に停止","して中間出力ディレクトリも削除させた。\nパイプラインの途中で寝かせると、次セッションで「これって完了？未完了？」を判定するコストが発生する。終わらせるか、いったん全部消すか、どちらかに倒すのが正解。",[14,272,273],{"id":273},"学び",[127,275,276,282,288,297],{},[98,277,278,281],{},[27,279,280],{},"OCR/restructure を並列バックグラウンドにすると、人間は別のことを並行できる","。朝のセッションで restructure 4 並列を回している間、自分は撮影済み書籍のメタデータ確認や excluded フラグ整理を進められた",[98,283,284,287],{},[27,285,286],{},"並列度を上げすぎないのもコツ","。OCR は GPU 1本縛りなので同時起動は 1 本まで。restructure は API rate limit を意識して 4 並列に止めた（増やすほど後出し result の取り回しが煩雑になる）",[98,289,290,293,294,296],{},[27,291,292],{},"スキル化すると「次これ」だけで進む","。",[42,295,92],{}," を一度作っておけば、夜セッションのように 19 冊連続で流すときに、人間側のセリフが「次のパスはこれ」だけで済む",[98,298,299,302],{},[27,300,301],{},"朝の6冊で得た定型が、夜の19冊で活きた","。朝のセッションは「定型を確立する」コスト込みだったが、夜は同じ手順をなぞるだけなので、人間のペースで上から順に投げ続けるだけになった",[14,304,306],{"id":305},"明日以降のtodo","明日以降のTODO",[127,308,311,321,327],{"className":309},[310],"contains-task-list",[98,312,315,320],{"className":313},[314],"task-list-item",[316,317],"input",{"disabled":318,"type":319},true,"checkbox"," 次回セッション開始時に「税務系で残った No469（723ページの大書、進行中で停止済み）」をクリーンスタートで再OCR",[98,322,324,326],{"className":323},[314],[316,325],{"disabled":318,"type":319}," 税務系のレビュー上位は一巡したので、次は会計・法律・IT 系の上位から",[98,328,330,332],{"className":329},[314],[316,331],{"disabled":318,"type":319}," ビジネス書として依頼が来ていた1冊（自己啓発系の有名本）を「専門書フィルタ」を外して追加",{"title":44,"searchDepth":334,"depth":334,"links":335},2,[336,341,345,346,347,348],{"id":16,"depth":334,"text":17,"children":337},[338,340],{"id":21,"depth":339,"text":22},3,{"id":50,"depth":339,"text":51},{"id":71,"depth":334,"text":72,"children":342},[343,344],{"id":85,"depth":339,"text":86},{"id":121,"depth":339,"text":122},{"id":143,"depth":334,"text":144},{"id":249,"depth":334,"text":249},{"id":273,"depth":334,"text":273},{"id":305,"depth":334,"text":306},"dev","朝のセッションで4冊バックグラウンドOCR＋restructureサブエージェント4並列という定型ワークフローを確立。夜は同じパイプラインで専門書を上から順に19冊取り込んだ。並列度の調整と人間側のペースコントロールがコツ","md",{},null,"/pdf-textbook-yomitoku-batch-pipeline","book-knowledge-base",false,"2026-06-24T00:00:00.000Z",{"title":5,"description":350},"2026-06/2026-06-24/pdf-textbook-yomitoku-batch-pipeline",[361,362,363,364,365,366],"yomitoku","OCR","蔵書","Turso","並列処理","バッチ処理","RwKOZVNi7XbpTr4GJQda1TAppQmK8hkPE0Ly2zoysGY",[],"https://log.eurekapu.com/og/blog/pdf-textbook-yomitoku-batch-pipeline.png?v=2026-06-24T00%3A00%3A00.000Z&title=PDF%E5%B0%82%E9%96%80%E6%9B%B8%E3%82%92yomitoku%E3%81%A7%E4%B8%A6%E5%88%97OCR%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%97%E3%81%9F%E8%A9%B1%20%E2%80%94%20%E6%9C%9D%E3%81%AE6%E5%86%8A%E3%83%90%E3%83%83%E3%83%81%E3%81%8B%E3%82%89%E5%A4%9C%E3%81%AE%E5%B0%82%E9%96%80%E6%9B%B8%E8%BF%BD%E8%B5%B0%E3%81%BE%E3%81%A7&author=Kei%20Komatsu&sig=00d95cc28e17dd93",1782364626398]