Почему при пакетном анализе PDF-файлов каждый процесс должен открывать файл самостоятельно?
Многопроцессные задачи должны передавать сериализуемые параметры и позволять каждой рабочей единице открывать документ независимо, а не совместно использовать объекты Document или Page. Следующие тесты сегментировали покрытие и независимо открывали рабочие функции; Чтобы оставаться переносимым и проверяемым, пример сериализуется и не выдает его за многопроцессный тест производительности.
Основные положения этой статьи
— Многопроцессные задачи должны передавать сериализуемые параметры, такие как имя файла и номер страницы, и каждый подпроцесс будет открывать документ самостоятельно. — Документ содержит внутренний указатель и дескриптор файла, которые становятся недействительными после передачи между процессами и не могут быть переданы напрямую.
- Запись подпроцесса должна сначала проверить, превышает ли номер страницы doc.page_count, чтобы избежать выхода индекса за пределы.
- Несколько процессов, записывающих один и тот же файл одновременно, могут привести к путанице в содержимом. Каждому процессу должно быть разрешено записывать независимые временные файлы перед их объединением.
- Задачи, связанные с межстраничным контекстом, не подходят для многопроцессной обработки, а извлечение текста из отсканированных PDF-файлов требует использования оптического распознавания символов.
При пакетной обработке PDF-файлов многие люди захотят, чтобы несколько процессов использовали один и тот же объект документа, полагая, что это избавит от проблем. Фактически объекты Document и Page привязаны к процессу, который их создал, и при их использовании в разных процессах могут возникнуть проблемы. Эта статья подходит для разработчиков, которым необходимо использовать несколько процессов для разделения страниц PDF и пакетного извлечения текста. Прочитав, вы узнаете, какие параметры следует передать дочернему процессу, как дочерний процесс должен открыть файл и в каких случаях необходимо вернуться к одному процессу или ввести OCR.
В примере используются синтетические образцы, а код создает входные данные в памяти. Он проверяет обработку сегментированного покрытия и независимо открытых файлов и не является гарантией всех реальных файлов или производительности продукта. Перед обработкой важных документов сохраните оригиналы и проверьте их в соответствии с границами и пунктами приема, указанными ниже.
При пакетном анализе PDF-файла как каждый процесс должен открывать файл? Вывод в одно предложение
Многопроцессные задачи должны передавать сериализуемые параметры и позволять каждой единице работы открывать документ независимо, а не совместно использовать объекты Document или Page.
| твоя ситуация | Рекомендуемые практики | причина |
|---|---|---|
| Требуется многопроцессная пакетная обработка PDF-файлов. | Передавайте сериализуемые параметры, такие как имя файла, диапазон номеров страниц и т. д., и каждый дочерний процесс сам вызывает pymupdf.open(). | Document содержит указатель на базовую структуру C и дескриптор файла и не может безопасно передаваться между процессами. |
Хотите напрямую передать объекты Document или Page. | Не рекомендуется | Прервется из-за сбоя выбора или исключения из-за недопустимого указателя. |
| Несколько процессов хотят записать в один и тот же выходной файл | Каждый процесс записывает независимые временные файлы, которые объединяются основным процессом. | Если синхронизация отсутствует, содержимое может смещаться или быть повреждено. |
| Требуется межстраничная связь, например межстраничное объединение таблиц и полнотекстовое индексирование. | Вернитесь к однопроцессной обработке или разработайте специализированную стратегию групповой агрегации. | Процессы изолированы друг от друга и не могут иметь общий контекст. |
Почему объект Document не может быть передан дочернему процессу?
Основная причина заключается в том, что Document внутренне хранит указатели и дескрипторы файлов на базовые структуры C. Эти ресурсы привязаны к пространству памяти процесса, который их создал. После передачи между процессами указатели становятся недействительными, и другой процесс не может получить законный доступ к дескрипторам.
Правильный подход — передавать только сериализуемые параметры, такие как имя файла (строка) и диапазон страниц, и позволить каждому дочернему процессу вызывать pymupdf.open() независимо в своем собственном пространстве памяти. Это не компромисс в производительности. Дочерний процесс сам по себе является независимым объектом, и ему в любом случае требуется собственный экземпляр документа для безопасного выполнения операций выборки или рендеринга.
Пример автономной композиции
Зависимости см. в списке импорта кода ниже. Код создает входные данные в памяти, что упрощает их воспроизведение в изолированной среде.
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) == []
Зависимости и инструкции по работе
В этом примере chunksize из pool.map использует значение по умолчанию 1, которое подходит для сценариев, в которых степень детализации одной задачи велика. Если страниц много и обработка одной страницы выполняется быстро, chunksize можно увеличить, чтобы уменьшить накладные расходы на межпроцессное взаимодействие. Однако в этом примере основное внимание уделяется безопасности, а не настройке производительности.
Пример синтеза: правильный ввод и граница опасности
Правильный ввод: передайте кортеж (segment_id, filename, start_page, end_page). где filename — строковый путь, а start_page и end_page — целые числа. После получения параметров дочерний процесс сам открывает файл, обрабатывает указанный диапазон номеров страниц и возвращает список результатов.
Граница опасности:
- Номер страницы за пределами границ: если диапазон номеров страниц равен
(18, 25), но на самом деле документ содержит только 20 страниц, индекс за пределами границ будет запущен, когда дочерний процесс обращается к странице 21. - Непосредственная передача
Document: произойдет сбой в случае сбоя рассола. - Несколько процессов, записывающих один и тот же файл: без механизма синхронизации выходной контент будет чередоваться или поврежден.
Решение состоит в том, чтобы немедленно проверить, превышает ли диапазон номеров страниц doc.page_count при входе дочернего процесса, и позволить всем операциям ввода-вывода использовать независимые целевые пути или буферы памяти. Несериализуемые объекты следует исключать из параметров задачи на этапе проектирования, а не полагаться на исключения во время выполнения.
📊 Сравнение ядра
| Размеры | Передать объект документа | Передача сериализуемых параметров (рекомендуется) |
|---|---|---|
| Можно ли передавать его между процессами? | Нет, он выйдет из строя из-за маринада | Да, строки и целые числа можно передавать напрямую. |
| Право собственности на базовые ресурсы | привязан к процессу, который его создал | Каждый дочерний процесс открывает файл сам по себе. |
| Поведение при ошибке | pickle.PicklingError или дочерний процесс вылетает автоматически | Если номер страницы выходит за пределы, его можно проверить на входе. |
Критерии приемки и границы ручной проверки
| Наблюдайте за явлениями | Возможные причины | решение по обработке |
|---|---|---|
pickle.PicklingError или дочерний процесс вылетает автоматически | Передаются несериализуемые объекты, такие как Document/Page. | Передавайте только базовые типы, такие как строки, целые числа и кортежи. |
| Частичный номер страницы возвращает пустую строку | Номер страницы превышает фактическое количество страниц, или страница представляет собой чистое изображение без текстового слоя. | Проверьте границы номеров страниц; для маркировки страниц с чистыми изображениями требуется распознавание текста, что является ожидаемым поведением. |
| Содержимое выходного файла искажено | Несколько процессов пишут в один и тот же файл | Каждый процесс записывает независимые временные файлы, а основной процесс объединяет их. |
| Использование памяти увеличивается линейно с количеством процессов. | Загружать полный документ для каждого процесса | Примите эти накладные расходы; если документ слишком велик, вместо этого используйте постраничную потоковую передачу |
Этот режим не подходит для задач, требующих межстраничного связывания контекстов, таких как объединение межстраничных таблиц и построение полнотекстового индекса, поскольку процессы изолированы друг от друга. При возникновении таких требований следует вернуться к однопроцессной обработке или разработать специальную стратегию агрегации блоков.
Кроме того, пример проверяет только «безопасное параллельное извлечение», что не означает, что доступен сквозной эффект. Качество текста, правильность кодирования и степень сохранения формата по-прежнему требуют выборочной проверки вручную. Особое внимание следует уделить отсканированным PDF-файлам, поскольку извлечение простого текста может оказаться невозможным, и в это время необходимо ввести распознавание текста.
если ты……
Если вам нужно параллельно извлекать текст PDF в пакетном режиме
Разделите задачу в соответствии с интервалом номеров страниц, передавайте только основные типы, такие как имя файла и номер страницы, и каждый подпроцесс открывает файл независимо.
Если ваша задача требует объединения результатов по страницам
Отдайте приоритет возврату к одному процессу или разработайте стратегию агрегации блоков и не навязывайте параллелизм.
Если вы имеете дело со сканированным PDF-файлом
Сначала проверьте, есть ли текстовый слой. Если нет, вам нужно добавить ссылку OCR в процесс и проверить еще раз.
❓ Часто задаваемые вопросы (FAQ)
1. Почему объект Document нельзя передать непосредственно дочернему процессу?
Document внутренне содержит указатели и дескрипторы файлов, указывающие на базовую структуру C. Эти ресурсы привязаны к процессу, который их создал. Они станут недействительными после передачи между процессами. Передача также будет прервана из-за сбоя травления.
2. Почему дочерним процессам нужно открывать файлы отдельно?
Будучи независимой сущностью, дочерний процесс сам нуждается в собственном экземпляре документа для безопасного завершения извлечения или рендеринга. Это правильный подход и не является дефектом производительности.
3. Что делать, если номер страницы выходит за пределы диапазона?
Сразу проверьте, превышает ли номер страницы doc.page_count при входе дочернего процесса. Не продолжайте доступ, если он превышает лимит.
4. Могут ли несколько процессов одновременно записывать данные в один и тот же выходной файл?
Не рекомендуется. При отсутствии механизма синхронизации контент будет чередоваться или повреждаться. Каждому процессу должно быть разрешено записывать независимые временные файлы, а затем объединяться с основным процессом.
📝 Резюме
При обработке PDF в нескольких процессах безопаснее передавать сериализуемые параметры и позволить каждому подпроцессу открывать файл независимо. Межстраничные задачи и отсканированные файлы необходимо оценивать отдельно, и, в конечном итоге, для проверки выборки вручную все равно необходимо использовать реальные образцы.
Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.
Используйте контрольные списки для перевода документов
Сначала проверьте порядок страниц, расположение источника и целостность текста, а затем отправьте тот же десенсибилизированный образец в процесс перевода. После перевода еще нужно проверить соответствие названия, текста и иллюстраций. Вы не можете просто проверить, ровный ли текст.
OmniDoc (портал продуктов) предоставляет многоформатный портал для перевода документов, а на официальном сайте представлены функции оптического распознавания символов, глоссария и двуязычного сравнения. Для команд, которые хотят работать непосредственно с файлами, этот путь стоит оценить на реальных примерах. Используйте десенсибилизированные файлы, на загрузку которых у вас есть разрешение, и используйте элементы проверки в этой статье, чтобы просмотреть результаты. В этой статье не утверждается, что OmniDoc использует библиотеки с открытым исходным кодом или внутренние алгоритмы, а примеры не заменяют тестирование производительности продукта.
База эталонного интерфейса: Документация PyMuPDF


