2017-03-15 2 views
1

Ich benutze PyCharm 2016.3.2 mit Python 3.6 als der Interpreter zum Konvertieren von PDF-Dateien zu .TXT Der Code, den ich habe (siehe unten) funktioniert gut, aber es konvertiert Dateien sequenziell und langsam . Ich frage mich, ob ich meine 8-Core-CPU nutzen kann, um das ein bisschen schneller zu machen. Hier ist der Code:Parallelisieren einer Schleife über Datei liest in Python

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"]) 

Ich bin neu in Python Codierung so jede mögliche Hilfe in diesen Codeblock Parallelisierung wird sehr geschätzt, da ich mit> 100.000 Dateien (65 GB +)

Dank zu tun habe !

Antwort

0

Da Sie viele Dokumente haben, die Sie analysieren möchten, ist dies relativ einfach. (Wenn Sie gefragt hätten, wie man ein einzelnes Dokument auf mehreren Kernen parsen würde, wäre es viel schwieriger gewesen).

Die Technik besteht darin, einen Pool von Arbeitern zu erstellen (in der Regel einen für jeden Kern, da Sie selten darüber hinaus viel Nutzen ziehen) und dann den Arbeitern Aufgaben zuweisen.

als Grundlage für Ihren Pool, können Sie entweder multiprocessing.Pool (mehrere Prozesse verwendet), multiprocessing.dummy.Pool (repliziert die gleiche API verwendet aber Threading) oder etwas jüngeren wie ThreadPoolExecutor.

werde ich die erste davon für dieses Beispiel verwenden:

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)) 

Dies ist ungetestet in den Details, aber die Grundzüge habe ich getestet. Beachten Sie, dass Threads bei der GIL in Python oft in Grenzen geraten, so dass Sie nicht die gesamte CPU verwenden, die Sie benötigen, während mehrere Prozesse dies umgehen, und zwar auf Kosten von Inbetriebnahme und Kommunikationsaufwand für jede Task.

Verwandte Themen