多处理蟒蛇 3.



我一直在尝试为 python 3 上的一系列任务创建一个多处理池。任务如下: 1. 通读 pdf 文件并捕获 pdf 文件中的表格,然后- 2. 创建一个泡菜文件来存储表对象 3. 加载泡菜文件

出于测试目的,我在三个 pdf 文件上以序列化和并行化模式运行了 python 代码。排序是在 200 秒内运行整个过程,并在工作目录中创建 pickle 文件。但是,多处理不会在目录中生成 pickle 文件,但运行进程需要 39 秒。

排序代码可以在下面找到:

os.chdir('C:/Users/dir_path')
def process_table(pdf):
for pdf in pdfs:
tables = camelot.read_pdf(pdf, pages = 'all', flag_size=True, copy_text=['v'], line_scale=40) 
print(f'Process {os.getpid()} Processing File Name:{pdf}nTotal Tables found:{len(tables)}')
with open(pdf.split('.pdf')[0] + '.pkl', 'wb') as f:
pickle.dump(tables, f)
print(f'Process {os.getpid()} Pickle file created for: {pdf}')
with open(pdf.split('.pdf')[0] + '.pkl', 'rb') as g:
pickle.load(g)
print(f'Process {os.getpid()} Pickle file loaded: {pdf}')
def process_handler():    
start_time = time.time()
pdfs = [file_name for file_name in os.listdir()]
process_table(pdfs)
end = time.time()
duration = round(time.time() - start_time)
print(f'Whole Process completed in {duration} second(s)') 

if __name__ == '__main__':
process_handler()    

代码的输出如下:

序列化输出 多处理的代码如下:

os.chdir('C:/Users/dir_path')
def process_table(pdf):
tables = camelot.read_pdf(pdf, pages = 'all', flag_size=True, copy_text=['v'], line_scale=40) 
print(f'Process {os.getpid()} Processing File Name:{pdf}nTotal Tables found:{len(tables)}')
with open(pdf.split('.pdf')[0] + '.pkl', 'wb') as f:
pickle.dump(tables, f)
print(f'Process {os.getpid()} Pickle file created for: {pdf}')
with open(pdf.split('.pdf')[0] + '.pkl', 'rb') as g:
pickle.load(g)
print(f'Process {os.getpid()} Pickle file loaded for: {pdf}')
def process_handler():    
start_time = time.time()
files = [file_name for file_name in os.listdir()]
with ThreadPoolExecutor() as executor:
executor.map(process_table, files)
duration = round(time.time() - start_time)
print(f'Whole Process completed in {duration} second(s)') 
if __name__ == '__main__':
process_handler()

我非常感谢您对此的宝贵反馈。这一点至关重要,因为有时 20 MB 的 pdf 文件需要很长时间才能转换为包含表对象的 pickle 文件。因此,该进程停滞在第一个作业(即大小为 20 MB(上.pdf,并且在第一个作业完成之前无法移动到下一个作业。

谢谢

一些项目;

  • 只使用了多处理池,我发现它运行得相当好。
  • process_table在 map 函数之外使用pdfs调用,串行处理也是如此。
  • 据我所知,work_items除了"没有"之外,不包含任何内容。
  • 您可以使用列表参数 (pdf( 调用process_table,但随后使用全局pdfs变量。

我会建议类似的东西;

import multiprocessing as mp
files = [file_name for file_name in os.listdir()]
with mp.Pool(mp.cpu_count()-1) as pool:
pool.map(files, process_table)

相关内容

  • 没有找到相关文章

最新更新