Quando si analizzano i PDF in batch, perché ogni processo dovrebbe aprire il file da solo?

Le attività multiprocesso dovrebbero passare parametri serializzabili e consentire a ciascuna unità di lavoro di aprire il documento in modo indipendente, anziché condividere oggetti Documento o Pagina. I seguenti test hanno segmentato la copertura e le funzioni di lavoro aperte in modo indipendente; Per rimanere portabile e verificabile, l'esempio è serializzato e non lo fa passare come un test delle prestazioni multiprocesso.

Quando si elaborano PDF in batch, molte persone vorranno che più processi condividano lo stesso oggetto documento, pensando che ciò eviterà problemi. Infatti, gli oggetti Document e Page sono vincolati al processo che li ha creati e potrebbero sorgere problemi quando li si utilizza tra processi. Questo articolo è adatto agli sviluppatori che necessitano di utilizzare più processi per dividere le pagine PDF ed estrarre il testo in batch. Dopo la lettura, saprai quali parametri devono essere passati al processo figlio, come il processo figlio deve aprire il file e in quali casi è necessario tornare a un singolo processo o introdurre l'OCR.

L'esempio usa campioni sintetici e il codice costruisce l'input in memoria. Verifica l'elaborazione della copertura segmentata e dei file aperti in modo indipendente e non rappresenta una garanzia di tutti i file reali o delle prestazioni del prodotto. Prima di elaborare documenti importanti, conservare gli originali e rivederli rispettando i limiti e gli elementi di accettazione riportati di seguito.

Quando si analizzano i PDF in batch, come dovrebbe ogni processo aprire il file? Conclusione di una frase

Le attività multiprocesso dovrebbero passare parametri serializzabili e fare in modo che ciascuna unità di lavoro apra il documento in modo indipendente, anziché condividere oggetti Document o Page.

la tua situazionePratiche consigliatemotivo
Richiede l'elaborazione batch multiprocesso dei PDFPassa parametri serializzabili come nome file, intervallo di numeri di pagina, ecc. e ogni processo figlio chiama pymupdf.open() da soloDocument contiene il puntatore della struttura C sottostante e l'handle del file e non può essere passato in modo sicuro tra i processi
Vuoi passare direttamente oggetti Document o PageNon raccomandatoSi interromperà a causa di un errore di pickle o di un'eccezione dovuta a un puntatore non valido
Più processi desiderano scrivere sullo stesso file di outputOgni processo scrive file temporanei indipendenti, che vengono uniti dal processo principaleQuando manca la sincronizzazione, il contenuto può risultare sfalsato o danneggiato
È necessaria l'associazione tra pagine, ad esempio l'unione di tabelle tra pagine e l'indicizzazione del testo completoTorna all'elaborazione a processo singolo o progetta una strategia di aggregazione specializzata in blocchiI processi sono isolati gli uni dagli altri e non possono condividere il contesto

Perché l'oggetto Document non può essere passato al processo figlio?

La causa principale è che Document contiene internamente puntatori e handle di file alle strutture C sottostanti. Queste risorse sono vincolate nello spazio di memoria del processo che le ha create. Dopo essere stati passati attraverso i processi, i puntatori diventano non validi e non è più possibile accedere legalmente agli handle da un altro processo.

L'approccio corretto consiste nel passare solo i parametri serializzabili come il nome del file (stringa) e l'intervallo di pagine e lasciare che ogni processo figlio chiami pymupdf.open() in modo indipendente nel proprio spazio di memoria. Questo non è un compromesso sulle prestazioni. Il processo figlio è un'entità indipendente a sé stante e richiede comunque la propria istanza del documento per eseguire in modo sicuro operazioni di recupero o rendering.

Esempio di composizione autonoma

Consulta l'elenco di importazione del codice riportato di seguito per le dipendenze. Il codice costruisce l'input in memoria, facilitandone la riproduzione in un ambiente isolato.

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) == []

Dipendenze e istruzioni operative

Nell'esempio, chunksize di pool.map utilizza il valore predefinito 1, adatto per scenari in cui la granularità di una singola attività è elevata. Se sono presenti molte pagine e l'elaborazione di una singola pagina è veloce, è possibile aumentare chunksize per ridurre il sovraccarico della comunicazione tra processi. Tuttavia, questo esempio si concentra sulla sicurezza, non sull'ottimizzazione delle prestazioni.

Esempio di sintesi: input corretto e confine di pericolo

Input corretto: passa la tupla (segment_id, filename, start_page, end_page). dove filename è un percorso di stringa e start_page e end_page sono numeri interi. Dopo aver ricevuto i parametri, il processo figlio apre il file da solo, elabora l'intervallo di numeri di pagina specificato e restituisce l'elenco dei risultati.

Confine di pericolo:

  • Numero di pagina fuori limite: se l'intervallo del numero di pagina è (18, 25), ma il documento in realtà ha solo 20 pagine, verrà attivato un indice fuori limite quando il processo figlio accede alla pagina 21.
  • Passaggio diretto di Document: si romperà se il pickle fallisce.
  • Processi multipli che scrivono lo stesso file: senza meccanismo di sincronizzazione, il contenuto di output sarà intercalato o danneggiato.

La soluzione è verificare immediatamente se l'intervallo del numero di pagine supera doc.page_count all'ingresso del processo figlio e lasciare che tutte le operazioni di I/O utilizzino percorsi di destinazione o buffer di memoria indipendenti. Gli oggetti non serializzabili dovrebbero essere esclusi dai parametri dell'attività in fase di progettazione anziché fare affidamento sul rilevamento delle eccezioni in fase di esecuzione.

📊 Confronto fondamentale

DimensioniPassa oggetto documentoPassa parametri serializzabili (consigliato)
Può essere trasmesso attraverso i processi?No, fallirà a causa del sottacetoSì, stringhe e numeri interi possono essere passati direttamente
Proprietà delle risorse sottostantilegato al processo che lo ha creatoOgni processo figlio apre il file da solo
Comportamento di errorepickle.PicklingError o il processo figlio si arresta in modo anomalo in modo silenziosoSe il numero di pagina è fuori limite è possibile verificarlo all'ingresso.

Criteri di accettazione e limiti della revisione manuale

Osservare i fenomeniPossibili ragionidecisione di elaborazione
pickle.PicklingError o il processo figlio si arresta in modo anomalo in modo silenziosoVengono passati oggetti non serializzabili come Document/PagePassa solo tipi di base come stringhe, numeri interi e tuple
Il numero di pagina parziale restituisce una stringa vuotaIl numero di pagina supera il numero effettivo di pagine oppure la pagina è un'immagine pura senza livello di testoVerificare i limiti del numero di pagina; contrassegnare le pagine con immagini pure richiede l'OCR, che è un comportamento previsto
Il contenuto del file di output è confusoPiù processi scrivono sullo stesso fileOgni processo scrive file temporanei indipendenti e il processo principale li unisce.
L'utilizzo della memoria aumenta linearmente con il numero di processiCarica il documento completo per processoAccetta questo sovraccarico; se il documento è troppo grande, utilizzare invece lo streaming di pagine

Questa modalità non è adatta per attività che richiedono l'associazione di contesti tra pagine, come l'unione di tabelle tra pagine e la creazione di indici full-text, poiché i processi sono isolati l'uno dall'altro. Quando si incontrano tali requisiti, è necessario ricorrere all'elaborazione a processo singolo o progettare una speciale strategia di aggregazione dei blocchi.

Inoltre, l'esempio verifica solo "l'estrazione parallela sicura", il che non significa che l'effetto end-to-end sia disponibile. La qualità del testo, la correttezza della codifica e il grado di conservazione del formato richiedono ancora una revisione manuale del campionamento. Particolare attenzione dovrebbe essere prestata ai PDF scansionati, poiché l'estrazione del testo semplice potrebbe fallire completamente e in questo momento è necessario introdurre l'OCR.

se tu……

Se hai bisogno di estrarre testo PDF in batch in parallelo

Suddividi l'attività in base all'intervallo del numero di pagina, passa solo i tipi di base come nome file e numero di pagina e ciascun processo secondario apre il file in modo indipendente.

Se la tua attività richiede l'unione dei risultati su più pagine

Dai la priorità al ritorno a un singolo processo o progetta una strategia di aggregazione dei blocchi e non forzare il parallelismo.

Se hai a che fare con un PDF scansionato

Per prima cosa conferma se c'è un livello di testo. In caso contrario, è necessario aggiungere un collegamento OCR al processo e ricontrollare.

❓ Domande frequenti (FAQ)

1. Perché l'oggetto Document non può essere passato direttamente al processo figlio?

Document contiene internamente puntatori e handle di file che puntano alla struttura C sottostante. Queste risorse sono legate al processo che le ha create. Diventeranno non validi dopo essere stati passati attraverso i processi. Il trasferimento verrà interrotto anche a causa di un guasto del salamoia.

2. Perché i processi secondari devono aprire i file separatamente?

In quanto entità indipendente, il processo figlio stesso necessita della propria istanza del documento per completare in modo sicuro l'estrazione o il rendering. Questo è l'approccio corretto e non rappresenta un difetto di prestazione.

3. Cosa devo fare se il numero di pagina supera l'intervallo?

Controlla immediatamente se il numero di pagina supera doc.page_count all'ingresso del processo figlio. Non continuare ad accedere quando si supera il limite.

4. Più processi possono scrivere lo stesso file di output contemporaneamente?

Non raccomandato. Quando non è presente un meccanismo di sincronizzazione, il contenuto verrà intercalato o danneggiato. A ciascun processo dovrebbe essere consentito di scrivere file temporanei indipendenti e quindi unificati dal processo principale.

📝 Riepilogo

Quando si elabora un PDF in più processi, è più sicuro passare parametri serializzabili e consentire a ciascun processo secondario di aprire il file in modo indipendente. Le attività relative a più pagine e i file scansionati devono essere valutati separatamente e, alla fine, è ancora necessario utilizzare campioni reali per la revisione manuale del campionamento.

Provalo subito: carica il documento per iniziare la traduzione, mantenendo il layout originale

Utilizza le liste di controllo per la traduzione dei documenti

Innanzitutto controlla l'ordine delle pagine, la posizione della fonte e l'integrità del testo, quindi invia lo stesso campione desensibilizzato al processo di traduzione. Dopo la traduzione, devi ancora verificare se titolo, testo e illustrazioni corrispondono correttamente. Non puoi semplicemente verificare se il testo è fluido.

OmniDoc (portale del prodotto) fornisce un portale di traduzione di documenti multiformato e il sito Web ufficiale introduce funzioni OCR, glossario e confronto bilingue. Per i team che desiderano lavorare direttamente dai file, questo è un percorso che vale la pena valutare con campioni reali. Utilizza file non sensibilizzati che sei autorizzato a caricare e utilizza gli elementi di controllo in questo articolo per esaminare i risultati. Non si afferma che OmniDoc utilizzi le librerie open source o gli algoritmi interni contenuti in questo articolo, né gli esempi sostituiscono i test sulle prestazioni del prodotto.

Base dell'interfaccia di riferimento: Documentazione PyMuPDF

Aggiornato il 2026-11-13