【发布时间】:2017-06-15 05:56:19
【问题描述】:
我正在创建一些代码来对大型 pdf 数据集执行 OCR,并将提取的文本写入 csv。这是使用 Imagemagick、Pillow、PyOCR (Tesseract) 等库的组合完成的,并且已经在小数据样本上进行了测试。
数据包含大量文件夹(约 2500 个),每个文件夹包含大约 15 个 pdf。为每个文件夹中的 pdf 创建一个 csv,处理每个文件夹大约需要 10 分钟。这意味着在所有 2500 个文件夹上运行 OCR 大约需要 18 天,这实在是太长了。我需要能够在 7 天或更短的时间内完成整个流程。
因此,我正在研究并行处理每个子文件夹,因为每个子文件夹的处理独立于任何其他子文件夹。我的第一种方法是使用 concurrent.futures 模块来创建一个 ProcessPool,如下所示:
executor = concurrent.futures.ProcessPoolExecutor(4)
futures = ([executor.submit(run_pdf_to_text_ocr, folder) for folder in sub_folders])
concurrent.futures.wait(futures)
这里的run_pdf_to_text_ocr() 是为每个文件夹运行处理的主要函数。进程使用的相同资源存在一些问题,我正在解决这些问题,以便每个文件夹(进程/线程)在其资源使用中被隔离。
当然,这个处理管道是 CPU 密集型的,并且在运行时会最大限度地利用处理器。我将启动一个大型 AWS EC2 实例以最终完成完整运行。所以,在开始之前我想知道的是:
如果我采用的这种方法是正确的? 我可以采取任何替代方法以更好的方式做到这一点吗?我应该使用分布式处理吗?我可以做些什么来正确监控这个长时间运行的管道,以便我能够了解在处理过程中可能出现的任何问题?
我对 Python 非常满意,并且希望尽可能多地使用它的解决方案。
【问题讨论】:
标签: python amazon-ec2 parallel-processing batch-processing distributed-computing