Proč by měl každý proces při analýze souborů PDF v dávkách otevřít soubor sám?

Víceprocesové úlohy by měly předávat serializovatelné parametry a nechat každou pracovní jednotku otevřít dokument nezávisle, spíše než sdílet objekty Document nebo Page. Následující testy testují segmentované pokrytí a nezávisle otevřené pracovní funkce; aby zůstal přenosný a auditovatelný, je příklad serializován a nevydává se za víceprocesový test výkonu.

Při dávkovém zpracování souborů PDF bude mnoho lidí chtít, aby více procesů sdílelo stejný objekt dokumentu, a myslí si, že to ušetří problémy. Ve skutečnosti jsou objekty Document a Page vázány na proces, který je vytvořil, a při jejich použití napříč procesy mohou nastat problémy. Tento článek je vhodný pro vývojáře, kteří potřebují použít více procesů k rozdělení stránek PDF a extrahování textu v dávkách. Po přečtení budete vědět, jaké parametry by se měly předat podřízenému procesu, jak má podřízený proces soubor otevřít a v jakých případech je nutné se vrátit k jedinému procesu nebo zavést OCR.

Příklad používá syntetické vzorky a kód konstruuje vstup v paměti. Ověřuje zpracování segmentovaného pokrytí a nezávisle otevřených souborů a nepředstavuje záruku všech skutečných souborů nebo výkonu produktu. Před zpracováním důležitých dokumentů si prosím uschovejte originály a zkontrolujte je podle níže uvedených hranic a položek přijetí.

Jak by měl každý proces při analýze PDF v dávkách otevřít soubor? Závěr jednou větou

Víceprocesové úlohy by měly předat serializovatelné parametry a každá jednotka práce by měla dokument otevřít nezávisle, spíše než sdílet objekty Document nebo Page.

vaší situaciDoporučené postupydůvod
Vyžaduje víceprocesové dávkové zpracování souborů PDFPředejte serializovatelné parametry, jako je název souboru, rozsah čísel stránek atd., a každý podřízený proces sám zavolá pymupdf.open()Document uchovává základní ukazatel struktury C a popisovač souboru a nelze je bezpečně předávat mezi procesy
Chcete přímo předat objekty Document nebo PageNedoporučuje sePřeruší se kvůli selhání moření nebo výjimce kvůli neplatnému ukazateli
Více procesů chce zapisovat do stejného výstupního souboruKaždý proces zapisuje nezávislé dočasné soubory, které jsou sloučeny hlavním procesemPokud synchronizace chybí, obsah se může rozložit nebo poškodit
Je vyžadováno přidružení mezi stránkami, jako je sloučení tabulek mezi stránkami a fulltextové indexováníVraťte se k jednoprocesovému zpracování nebo navrhněte specializovanou strategii agregaceProcesy jsou od sebe izolované a nemohou sdílet kontext

Proč nelze objekt Document předat podřízenému procesu?

Hlavní příčinou je, že Document interně drží ukazatele a popisovače souborů na základní struktury C. Tyto prostředky jsou vázány v paměťovém prostoru procesu, který je vytvořil. Po předání přes procesy se ukazatele stanou neplatnými a jiný proces k nim nemůže legálně přistupovat.

Správným přístupem je předat pouze serializovatelné parametry, jako je název souboru (řetězec) a rozsah stránek, a nechat každý podřízený proces volat pymupdf.open() nezávisle ve svém vlastním paměťovém prostoru. Nejedná se o výkonnostní kompromis. Podřízený proces je nezávislá entita sama o sobě a k bezpečnému provádění operací načítání nebo vykreslování vyžaduje svou vlastní instanci dokumentu.

Příklad samostatné kompozice

Závislosti naleznete v seznamu importu kódu níže. Kód vytváří vstup v paměti, takže jej lze snadno reprodukovat v izolovaném prostředí.

import pymupdf
def partition(total, chunk):
    if type(chunk) is not int or chunk <= 0:
        raise ValueError("positive chunk required")
    return [(start, min(start + chunk, total)) for start in range(0, total, chunk)]
def worker(raw, start, end):
    with pymupdf.open(stream=raw, filetype="pdf") as doc:
        return [(i, doc[i].get_text()) for i in range(start, end)]
with pymupdf.open() as doc:
    for index in range(5):
        doc.new_page().insert_text((50, 50), f"Page {index}")
    raw = doc.tobytes()
tasks = partition(5, 2)
assert tasks == [(0, 2), (2, 4), (4, 5)]
results = [item for start, end in tasks for item in worker(raw, start, end)]
assert [i for i, text in results] == list(range(5))
assert all(f"Page {i}" in text for i, text in results)
assert partition(0, 2) == []

Závislosti a provozní pokyny

V příkladu chunksize z pool.map používá výchozí hodnotu 1, která je vhodná pro scénáře, kde je granularita jednoho úkolu velká. Pokud existuje mnoho stránek a zpracování jedné stránky je rychlé, lze chunksize zvýšit, aby se snížila režie komunikace mezi procesy. Tento příklad se však zaměřuje na zabezpečení, nikoli na ladění výkonu.

Příklad syntézy: Správná hranice vstupu a nebezpečí

Správný vstup: Předejte n-tici (segment_id, filename, start_page, end_page). kde filename je cesta řetězce a start_page a end_page jsou celá čísla. Po obdržení parametrů podřízený proces otevře soubor sám, zpracuje zadaný rozsah čísel stránek a vrátí seznam výsledků.

Hranice nebezpečí:

  • Číslo stránky je mimo rámec: Pokud je rozsah čísel stránek (18, 25), ale dokument má ve skutečnosti pouze 20 stránek, spustí se index mimo rámec, když podřízený proces přistoupí na stránku 21.
  • Přímé předání Document: přeruší se, pokud nakládání selže.
  • Více procesů zapisujících stejný soubor: bez synchronizačního mechanismu bude výstupní obsah prokládán nebo poškozen.

Řešením je okamžitě ověřit, zda rozsah čísel stránek překračuje doc.page_count na vstupu podřízeného procesu, a nechat všechny I/O operace používat nezávislé cílové cesty nebo vyrovnávací paměti. Objekty, které nelze serializovat, by měly být vyloučeny z parametrů úlohy ve fázi návrhu, spíše než se spoléhat na výjimky zachycení za běhu.

📊 Srovnání jádra

RozměryObjekt Pass DocumentPředat serializovatelné parametry (doporučeno)
Lze to předat napříč procesy?Ne, selže kvůli nakládáníAno, řetězce a celá čísla lze předávat přímo
Vlastnictví podkladových zdrojůvázaná na proces, který ji vytvořilKaždý podřízený proces otevře soubor sám
Chybové chovánípickle.PicklingError nebo podřízený proces se tiše zhroutíPokud je číslo stránky mimo rámec, lze jej ověřit u vchodu.

Kritéria přijetí a hranice manuální kontroly

Pozorovat jevyMožné důvodyrozhodnutí o zpracování
pickle.PicklingError nebo podřízený proces se tiše zhroutíObjekty, které nelze serializovat, jako například Dokument/Stránka jsou předányPředávejte pouze základní typy, jako jsou řetězce, celá čísla a n-tice
Částečné číslo stránky vrátí prázdný řetězecČíslo stránky překračuje skutečný počet stránek nebo je stránka čistě obrázkem bez textové vrstvyOvěřte hranice čísel stránek; označení čistě obrázkových stránek vyžaduje OCR, což je očekávané chování
Obsah výstupního souboru je zkomolenýVíce procesů zapisuje do stejného souboruKaždý proces zapisuje nezávislé dočasné soubory a hlavní proces je sloučí.
Využití paměti roste lineárně s počtem procesůNačíst celý dokument na procesPřijměte tuto režii; pokud je dokument příliš velký, použijte místo něj stránkované streamování

Tento režim není vhodný pro úlohy, které vyžadují přidružení kontextu mezi stránkami, jako je slučování tabulek mezi stránkami a vytváření fulltextového indexu, protože procesy jsou od sebe izolované. Když narazíte na takové požadavky, měli byste se vrátit k jednoprocesovému zpracování nebo navrhnout speciální strategii agregace bloků.

Kromě toho příklad pouze ověřuje "bezpečnou paralelní extrakci", což neznamená, že je k dispozici end-to-end efekt. Kvalita textu, správnost kódování a stupeň zachování formátu stále vyžadují ruční kontrolu vzorkování. Zvláštní pozornost je třeba věnovat naskenovaným PDF, protože extrakce prostého textu může zcela selhat a v tuto chvíli je nutné zavést OCR.

pokud jste……

Pokud potřebujete extrahovat text PDF v dávkách paralelně

Rozdělte úlohu podle intervalu čísel stránek, předejte pouze základní typy, jako je název souboru a číslo stránky, a každý dílčí proces otevírá soubor samostatně.

Pokud váš úkol vyžaduje sloučení výsledků napříč stránkami

Upřednostněte návrat k jedinému procesu nebo navrhněte strategii agregace bloků a nevynucujte paralelismus.

Pokud máte co do činění s naskenovaným PDF

Nejprve zkontrolujte, zda existuje textová vrstva. Pokud ne, musíte do procesu přidat odkaz OCR a znovu zkontrolovat.

❓ Často kladené otázky (FAQ)

1. Proč nelze objekt Document předat přímo podřízenému procesu?

Document interně uchovává ukazatele a popisovače souborů ukazující na základní strukturu C. Tyto zdroje jsou vázány na proces, který je vytvořil. Po předání napříč procesy se stanou neplatnými. Přenos bude také přerušen kvůli selhání moření.

2. Proč musí podřízené procesy otevírat soubory samostatně?

Jako nezávislá entita potřebuje podřízený proces k bezpečnému dokončení extrakce nebo vykreslení vlastní instanci dokumentu. Toto je správný přístup a nejedná se o vadu výkonu.

3. Co mám dělat, pokud číslo stránky přesahuje rozsah?

Okamžitě zkontrolujte, zda číslo stránky překračuje doc.page_count na vstupu podřízeného procesu. Nepokračujte v přístupu, když překročí limit.

4. Může více procesů zapisovat do stejného výstupního souboru současně?

Nedoporučuje se. Pokud neexistuje žádný synchronizační mechanismus, obsah bude prokládán nebo poškozen. Každý proces by měl mít povoleno zapisovat nezávislé dočasné soubory a poté sloučit hlavním procesem.

📝 Shrnutí

Při zpracování PDF ve více procesech je bezpečnější předat serializovatelné parametry a nechat každý dílčí proces otevřít soubor nezávisle. Mezistránkové úlohy a naskenované soubory je třeba vyhodnocovat samostatně a nakonec je stále třeba použít skutečné vzorky pro ruční kontrolu vzorkování.

Vyzkoušejte to hned: Nahrajte dokument a začněte překládat při zachování původního rozvržení

Použijte kontrolní seznamy pro překlad dokumentů

Nejprve zkontrolujte pořadí stránek, umístění zdroje a integritu textu a poté odešlete stejný znecitlivěný vzorek do procesu překladu. Po překladu je ještě potřeba zkontrolovat, zda název, text a ilustrace správně odpovídají. Nemůžete jen zkontrolovat, zda je text hladký.

OmniDoc (produktový portál) poskytuje portál pro překlad dokumentů ve více formátech a oficiální webové stránky zavádějí funkce OCR, glosář a dvojjazyčné porovnání. Pro týmy, které chtějí pracovat přímo ze souborů, je to cesta, kterou stojí za to vyhodnotit pomocí reálných vzorků. Použijte prosím znecitlivěné soubory, k jejichž nahrávání máte oprávnění, a ke kontrole výsledků použijte zaškrtávací položky v tomto článku. Neexistuje žádné tvrzení, že OmniDoc používá open source knihovny nebo interní algoritmy v tomto článku, ani příklady nenahrazují testování výkonu produktu.

Základ referenčního rozhraní: dokumentace PyMuPDF

Aktualizováno 2026-11-13