在Python

时间:2017-03-15 01:16:28

标签: python python-3.x parsing pdf pycharm

我使用PyCharm 2016.3.2和Python 3.6作为解释器将PDF文件转换为.TXT 我的代码(见下文)工作正常,但它顺序缓慢地转换文件。我想知道我是否可以利用我的8核cpu来提高速度。这是代码:

from tika import parser
from os import listdir
for filename in listdir("C:\\Dropbox\\Data"):
    text = parser.from_file('C:\\Dropbox\\Data'+filename)
    with open('C:\\Dropbox\\Data\\textoutput\\'+filename+'.txt', 'w+') as outfile : 
        outfile.write(text["content"])

我是Python编码的新手,所以任何帮助并行化这段代码都会非常感激,因为我正在处理> 100,000个文件(65 GB +)

谢谢!

1 个答案:

答案 0 :(得分:0)

由于您要解析许多文档,因此相对容易。 (如果您一直在询问如何在多个核心上解析单个文档,那将会更加困难。)

技术是创建一个工作池(通常每个核心一个,因为除此之外你很少得到很多好处),然后将任务分配给工人。

作为您的池的基础,您可以使用multiprocessing.Pool(使用多个进程),multiprocessing.dummy.Pool(复制相同的API但使用线程),或更新近的内容,如ThreadPoolExecutor

我将在本例中使用第一个:

import os
from multiprocessing import Pool

from tika import parser

dirname = "C:\\Dropbox\\Data"
# I changed your output dir, otherwise `listdir` will include `textoutput`
output_dirname = "C:\\Dropbox\\textoutput"

def process_file(filename):
    text = parser.from_file(os.path.join(dirname, filename))
    with open(os.path.join(output_dirname, filename + '.txt'), 'w+') as outfile:
        outfile.write(text["content"])

pool = Pool(processes=8)
pool.map(process_file, os.listdir(dirname))

这在细节上未经测试,但是我测试过的基本大纲。

请注意,线程经常会遇到Python中GIL的限制,因此您最终不会使用所有可用的CPU,而多个进程会以此为代价,但代价是每个任务的启动和通信开销。