我使用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 +)
谢谢!
答案 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,而多个进程会以此为代价,但代价是每个任务的启动和通信开销。