ich schreibe gerade eine Routine mit der ich sehr viele (ca. 100.000) XML Dateien verarbeiten muss. Im ersten Schritt, als Vorselektion will ich im Header nach einem bestimmten String schauen, da ich dadurch die tatsächlich per lxml zu verarbeitende Anzahl deutlich reduzieren kann. Dafür hatte ich gedacht multiprocessing zu nutzen. Leider gelingt es mir bisher nicht aus den Subprozessen irgendein Resultat heraus zu lesen. Ich habe gestern sehr viel auf StackOverflow und sonst im Netz nach Lösungen gesucht. Habe es aus multiprocessing mit Manager(), Queue() und Array() versucht, aber nie bekam ich das Resultat wieder eingesammelt.
Auch der Versuch bei positivem Ergebnis eine temporäre Dummydatei zu schreiben, die dann im Anschluss eingesammelt werden können gelang mir nicht. Obwohl dafür ja gar kein Variablenaustausch zwischen den Prozessen notwendig wäre. Wahrscheinlich steckt schon vorher ein grundsätzlicher Fehler drin, so dass die XMLs gar nicht erst wie erwartet gelesen werden.
Hier mal ein Codeschnipsel, den ich natürlich bereits vielfach modifiziert hatte:
Code: Alles auswählen
def processFile(file):
xmlname = '{}.xml'.format(file[:-4])
zip = zipfile.ZipFile('{}/{}'.format(pp, file))
inputfile = zip.open(xmlname, 'r')
inputfile = io.TextIOWrapper(inputfile, encoding='utf-8')
for i in range(15):
line = inputfile.readline()
if '<nasoperation>NBA' in line:
newfile = open(inputfile[:-4], 'w')
newfile.close()
def multiFileLoop():
start = time.time()
p = Pool()
for lauf, file in enumerate(files[:3000]):
if lauf > 1 and lauf%100 == 0:
print(lauf)
p.apply_async(processFile, file)
p.close()
p.join()
ende = time.time() - start
print('Laufzeit: {} sek.'.format(ende))
#print('{} x NBA Protokolle.'.format(counter))