2017-12-28 15 views
0

Ich verwende Xsl-Datei, um mehrere XML-Dateien zusammenzuführen. Die Anzahl der Dateien beträgt ungefähr 100 und jede Datei hat 4000 Knoten. Das Beispiel XML- und XSL finden Sie hier in diesem SO questionBeschleunigung der Zusammenführung mehrerer XML-Dateien in Python

Mein xmlmerge.py ist wie folgt:

import lxml.etree as ET 
import argparse 
import os 
ap = argparse.ArgumentParser() 
ap.add_argument("-x", "--xmlreffile", required=True, help="Path to list of xmls") 
ap.add_argument("-s", "--xslfile", required=True, help="Path to the xslfile") 
args = vars(ap.parse_args())  
dom = ET.parse(args["xmlreffile"]) 
xslt = ET.parse(args["xslfile"]) 
transform = ET.XSLT(xslt) 
newdom = transform(dom) 
print(ET.tostring(newdom, pretty_print=True)) 

ich die Ausgabe der Python zu einer XML-Datei zu schreiben ... so meinen Code ausführen, um die python-Skript ist wie folgt:

python xmlmerge.py --xmlreffile ~/Documents/listofxmls.xml --xslfile ~/Documents/xslfile.xsl 

Für 100 Dateien, wenn ich die Ausgabe auf einer Konsole zu drucken, es jedoch rund 120 Minuten dauert, wenn ich versuche,

die gleiche Leistung in einer xML-Datei zu speichern 10
python xmlmerge.py --xmlreffile ~/Documents/listofxmls.xml --xslfile ~/Documents/xslfile.xsl >> ~/Documents/mergedxml.xml 

Das dauert etwa 3 Tage, aber die Zusammenführung ist noch nicht vorbei. Ich war mir nicht sicher, ob die Maschine aufgehängt wurde und daher mit nur 8 Dateien auf einer anderen Maschine ausprobiert wurde, und es hatte mehr als 4 Stunden gedauert, aber die Zusammenführung ist noch nicht abgeschlossen. Ich weiß nicht, warum es so viel Zeit in Anspruch nimmt, wenn ich in die Datei schreibe, aber nicht, wenn ich auf die Konsole drucke. Kann mich jemand führen?

Ich benutze Ubuntu 14.04, Python 2.7.

Antwort

0

Warum erstellen Sie keine Multi-Processing-Version Ihres Skripts? Es gibt mehrere Möglichkeiten, wie Sie es tun könnte, aber von dem, was ich verstehe, hier ist das, was ich dann

list = open("listofxmls.xml","r")# assuming this gives you a list of files (adapt if necessary) 

yourFunction(xml): 
    steps 
    of your 
    parse funct 
    return(ET.tostring(newdom, pretty_print=True)) 

from multiprocessing.dummy import Pool as ThreadPool 
pool = ThreadPool(4) # number of threads (adapt depending on the task and your CPU) 
mergedXML = pool.map(yourFunction,list) # execute the function in parallel 
pool.close() 
pool.join() 

tun würde, speichern Sie Ihre mergedXML wie Sie möchten.

Ich hoffe, es hilft oder führt Sie in die richtige Richtung

Verwandte Themen