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ší situaci | Doporučené postupy | důvod |
|---|---|---|
| Vyžaduje víceprocesové dávkové zpracování souborů PDF | Př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 Page | Nedoporučuje se | Př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 souboru | Každý proces zapisuje nezávislé dočasné soubory, které jsou sloučeny hlavním procesem | Pokud 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 agregace | Procesy 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ěry | Objekt Pass Document | Př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řil | Kaž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 jevy | Možné důvody | rozhodnutí 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ány | Př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é vrstvy | Ověř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 souboru | Kaž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 proces | Př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


