Khi phân tích cú pháp các tệp PDF theo lô, tại sao mỗi quy trình phải tự mở tệp?

Các tác vụ đa quy trình phải chuyển các tham số có thể tuần tự hóa và cho phép mỗi đơn vị công việc mở tài liệu một cách độc lập, thay vì chia sẻ các đối tượng Tài liệu hoặc Trang. Các thử nghiệm sau đây đã phân chia vùng phủ sóng và các chức năng của nhân viên được mở độc lập; để duy trì tính di động và có thể kiểm tra được, ví dụ này được tuần tự hóa và không chuyển nó thành một bài kiểm tra hiệu năng đa quy trình.

Khi xử lý hàng loạt tệp PDF, nhiều người sẽ muốn có nhiều quy trình chia sẻ cùng một đối tượng tài liệu vì nghĩ rằng điều này sẽ tránh được rắc rối. Trên thực tế, các đối tượng Document và Page bị ràng buộc với quy trình đã tạo ra chúng và các vấn đề có thể phát sinh khi sử dụng chúng trên nhiều quy trình. Bài viết này phù hợp với những nhà phát triển cần sử dụng nhiều quy trình để chia nhỏ các trang PDF và trích xuất văn bản hàng loạt. Sau khi đọc, bạn sẽ biết những tham số nào sẽ được chuyển cho tiến trình con, cách tiến trình con sẽ mở tệp và trong trường hợp nào cần quay lại một tiến trình duy nhất hoặc giới thiệu OCR.

Ví dụ này sử dụng các mẫu tổng hợp và mã xây dựng đầu vào trong bộ nhớ. Nó xác minh việc xử lý phạm vi bảo hiểm được phân đoạn và các tệp được mở độc lập và không thể hiện sự đảm bảo về tất cả các tệp thực hoặc hiệu suất sản phẩm. Trước khi xử lý các tài liệu quan trọng, vui lòng giữ lại bản gốc và xem xét theo ranh giới và các mục chấp nhận dưới đây.

Khi phân tích cú pháp PDF theo lô, mỗi quy trình nên mở tệp như thế nào? Một câu kết luận

Các tác vụ đa quy trình phải chuyển các tham số có thể tuần tự hóa và yêu cầu mỗi đơn vị công việc mở tài liệu một cách độc lập, thay vì chia sẻ các đối tượng Document hoặc Page.

hoàn cảnh của bạnCác phương pháp được đề xuấtlý do
Yêu cầu xử lý hàng loạt tệp PDF theo nhiều quy trìnhTruyền các tham số có thể tuần tự hóa như tên tệp, phạm vi số trang, v.v. và mỗi tiến trình con sẽ tự gọi pymupdf.open()Document giữ con trỏ cấu trúc C bên dưới và xử lý tệp và không thể được chuyển qua các quy trình một cách an toàn
Muốn truyền trực tiếp các đối tượng Document hoặc PageKhông được đề xuấtSẽ bị gián đoạn do lỗi dưa hoặc ngoại lệ do con trỏ không hợp lệ
Nhiều tiến trình muốn ghi vào cùng một tệp đầu raMỗi tiến trình ghi các tệp tạm thời độc lập, được hợp nhất bởi tiến trình chínhKhi thiếu đồng bộ hóa, nội dung có thể bị lệch hoặc bị hỏng
Cần phải có liên kết giữa các trang, chẳng hạn như hợp nhất bảng và lập chỉ mục toàn vănQuay trở lại xử lý một quy trình hoặc thiết kế chiến lược tổng hợp theo khối chuyên biệtCác quy trình được tách biệt với nhau và không thể chia sẻ bối cảnh

Tại sao đối tượng Document không thể được truyền tới tiến trình con?

Nguyên nhân cốt lõi là do Document giữ nội bộ các con trỏ và xử lý tệp đối với các cấu trúc C cơ bản. Các tài nguyên này bị ràng buộc trong không gian bộ nhớ của quá trình tạo ra chúng. Sau khi được chuyển qua các tiến trình, các con trỏ trở nên không hợp lệ và các thẻ điều khiển không thể được truy cập hợp pháp bởi một tiến trình khác.

Cách tiếp cận đúng là chỉ truyền các tham số có thể tuần tự hóa như tên tệp (chuỗi) và phạm vi trang, đồng thời để mỗi tiến trình con gọi pymupdf.open() một cách độc lập trong không gian bộ nhớ riêng của nó. Đây không phải là một sự thỏa hiệp về hiệu suất. Tiến trình con là một thực thể độc lập theo đúng nghĩa của nó và yêu cầu phiên bản tài liệu riêng của nó để thực hiện các hoạt động tìm nạp hoặc hiển thị một cách an toàn.

Ví dụ về bố cục khép kín

Xem danh sách nhập mã bên dưới để biết các phần phụ thuộc. Mã xây dựng đầu vào trong bộ nhớ, giúp dễ dàng tái tạo trong môi trường biệt lập.

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

Các phần phụ thuộc và hướng dẫn vận hành

Trong ví dụ, chunksize của pool.map sử dụng giá trị mặc định 1, phù hợp với các tình huống trong đó mức độ chi tiết của một tác vụ đơn lẻ lớn. Nếu có nhiều trang và quá trình xử lý một trang diễn ra nhanh chóng, chunksize có thể được tăng lên để giảm chi phí liên lạc giữa các quá trình. Tuy nhiên, ví dụ này tập trung vào bảo mật chứ không phải điều chỉnh hiệu suất.

Ví dụ tổng hợp: Đầu vào chính xác và ranh giới nguy hiểm

Đầu vào đúng: Chuyển bộ (segment_id, filename, start_page, end_page). trong đó filename là đường dẫn chuỗi và start_page và end_page là số nguyên. Sau khi nhận được các tham số, tiến trình con sẽ tự mở tệp, xử lý phạm vi số trang đã chỉ định và trả về danh sách kết quả.

Ranh giới nguy hiểm:

  • Số trang ngoài giới hạn: Nếu phạm vi số trang là (18, 25) nhưng thực tế tài liệu chỉ có 20 trang thì chỉ mục ngoài giới hạn sẽ được kích hoạt khi tiến trình con truy cập trang 21.
  • Truyền trực tiếp Document: sẽ bị hỏng nếu dưa không thành công.
  • Nhiều tiến trình ghi cùng một file: nếu không có cơ chế đồng bộ, nội dung đầu ra sẽ bị xen kẽ hoặc bị hỏng.

Giải pháp là xác minh ngay xem phạm vi số trang có vượt quá doc.page_count ở mục nhập của quy trình con hay không và để tất cả các hoạt động I/O sử dụng đường dẫn đích hoặc bộ nhớ đệm độc lập. Các đối tượng không thể tuần tự hóa nên được loại trừ khỏi các tham số tác vụ ở giai đoạn thiết kế thay vì dựa vào các ngoại lệ bắt được thời gian chạy.

📊 So sánh cốt lõi

Kích thướcTruyền đối tượng Tài liệuTruyền các tham số có thể tuần tự hóa (được khuyến nghị)
Nó có thể được chuyển qua các quy trình không?Không, nó sẽ thất bại do dưa chuaCó, chuỗi và số nguyên có thể được truyền trực tiếp
Quyền sở hữu các tài nguyên cơ bảnbị ràng buộc với quá trình tạo ra nóMỗi tiến trình con tự mở tệp
Hành vi lỗipickle.PicklingError hoặc tiến trình con bị treo âm thầmNếu số trang vượt quá giới hạn, nó có thể được xác minh ở lối vào.

Tiêu chí chấp nhận và ranh giới đánh giá thủ công

Quan sát hiện tượngLý do có thểquyết định xử lý
pickle.PicklingError hoặc tiến trình con bị treo âm thầmCác đối tượng không thể tuần tự hóa như Tài liệu/Trang được chuyển quaChỉ truyền các loại cơ bản như chuỗi, số nguyên và bộ dữ liệu
Số trang một phần trả về chuỗi trốngSố trang vượt quá số trang thực tế hoặc trang chỉ là hình ảnh thuần túy không có lớp văn bảnXác minh ranh giới số trang; việc đánh dấu các trang hình ảnh thuần túy yêu cầu OCR, đây là hành vi được mong đợi
Nội dung tập tin đầu ra bị cắt xénNhiều tiến trình ghi vào cùng một tập tinMỗi quy trình ghi các tệp tạm thời độc lập và quy trình chính sẽ hợp nhất chúng.
Việc sử dụng bộ nhớ tăng tuyến tính với số lượng tiến trìnhTải toàn bộ tài liệu cho mỗi quy trìnhChấp nhận chi phí này; nếu tài liệu quá lớn, thay vào đó hãy sử dụng tính năng phát trực tuyến theo phân trang

Chế độ này không phù hợp với các tác vụ yêu cầu liên kết ngữ cảnh giữa các trang, chẳng hạn như hợp nhất bảng nhiều trang và xây dựng chỉ mục toàn văn bản, vì các quy trình này bị tách biệt với nhau. Khi gặp những yêu cầu như vậy, bạn nên quay lại xử lý một quy trình hoặc thiết kế chiến lược tổng hợp khối đặc biệt.

Ngoài ra, ví dụ này chỉ xác minh "trích xuất song song an toàn", điều đó không có nghĩa là có sẵn hiệu ứng đầu cuối. Chất lượng văn bản, độ chính xác của mã hóa và mức độ bảo toàn định dạng vẫn yêu cầu xem xét lấy mẫu thủ công. Cần đặc biệt chú ý đến các tệp PDF được quét, vì việc trích xuất văn bản thuần túy có thể hoàn toàn không thành công và phải áp dụng OCR vào lúc này.

nếu bạn……

Nếu bạn cần trích xuất hàng loạt văn bản PDF

Chia tác vụ theo khoảng cách số trang, chỉ chuyển các loại cơ bản như tên tệp và số trang, còn mỗi quy trình phụ sẽ mở tệp độc lập.

Nếu nhiệm vụ của bạn yêu cầu hợp nhất kết quả trên các trang

Ưu tiên quay lại một quy trình duy nhất hoặc thiết kế chiến lược tổng hợp khối và không ép buộc song song.

Nếu bạn đang xử lý bản PDF được quét

Đầu tiên hãy xác nhận xem có lớp văn bản hay không. Nếu không, bạn cần thêm liên kết OCR vào quy trình và kiểm tra lại.

❓ Câu hỏi thường gặp (FAQ)

1. Tại sao đối tượng Document không thể được truyền trực tiếp tới tiến trình con?

Document chứa nội bộ các con trỏ và các thẻ điều khiển tệp trỏ đến cấu trúc C bên dưới. Những tài nguyên này bị ràng buộc với quá trình tạo ra nó. Chúng sẽ trở nên không hợp lệ sau khi được chuyển qua các quy trình. Việc chuyển giao cũng sẽ bị gián đoạn do lỗi dưa chua.

2. Tại sao các tiến trình con cần mở file riêng biệt?

Là một thực thể độc lập, bản thân tiến trình con cần có phiên bản tài liệu riêng của nó để hoàn thành việc trích xuất hoặc hiển thị một cách an toàn. Đây là cách tiếp cận đúng và không phải là một khiếm khuyết về hiệu suất.

3. Tôi phải làm gì nếu số trang vượt quá phạm vi?

Kiểm tra ngay xem số trang có vượt quá doc.page_count khi vào tiến trình con hay không. Không tiếp tục truy cập khi vượt quá giới hạn.

4. Nhiều tiến trình có thể ghi cùng một tệp đầu ra cùng một lúc không?

Không được khuyến khích. Khi không có cơ chế đồng bộ, nội dung sẽ bị xen kẽ hoặc bị hỏng. Mỗi quy trình phải được phép ghi các tệp tạm thời độc lập và sau đó được hợp nhất với quy trình chính.

📝 Tóm tắt

Khi xử lý PDF trong nhiều quy trình, sẽ an toàn hơn khi truyền các tham số có thể tuần tự hóa và để mỗi quy trình phụ mở tệp một cách độc lập. Các tác vụ liên quan đến nhiều trang và các tệp được quét cần phải được đánh giá riêng biệt và cuối cùng, các mẫu thực vẫn cần được sử dụng để đánh giá lấy mẫu thủ công.

Thử ngay: Tải tài liệu lên để bắt đầu dịch, giữ nguyên bố cục ban đầu

Sử dụng danh sách kiểm tra để dịch tài liệu

Trước tiên hãy kiểm tra thứ tự trang, vị trí nguồn và tính toàn vẹn của văn bản, sau đó gửi cùng một mẫu đã được giải mẫn cảm cho quá trình dịch. Sau khi dịch, bạn vẫn cần kiểm tra xem tiêu đề, văn bản và hình minh họa có khớp chính xác hay không. Bạn không thể chỉ kiểm tra xem văn bản có mượt mà hay không.

OmniDoc (cổng thông tin sản phẩm) cung cấp cổng dịch thuật tài liệu đa định dạng và trang web chính thức giới thiệu các chức năng so sánh OCR, bảng thuật ngữ và song ngữ. Đối với các nhóm muốn làm việc trực tiếp từ các tệp, đây là con đường đáng để đánh giá bằng các mẫu thực tế. Vui lòng sử dụng các tệp đã được giải mẫn cảm mà bạn có quyền tải lên và sử dụng các mục kiểm tra trong bài viết này để xem lại kết quả. Không có tuyên bố nào cho thấy OmniDoc sử dụng các thư viện nguồn mở hoặc thuật toán nội bộ trong bài viết này và các ví dụ này cũng không thể thay thế cho việc kiểm tra hiệu suất sản phẩm.

Cơ sở giao diện tham khảo: Tài liệu PyMuPDF

Cập nhật lúc 2026-11-13