2016-06-29 8 views
0

Ich muss terminologische Ressource IATE in JSON in einem bestimmten Format für die weitere Verarbeitung konvertieren. Ich benutze xml.etree, um durch das XML zu iterieren, überprüfe die Tags bedingt und füge relevante Texte in ein Wörterbuch ein. Ich brauche eine Liste dieser Wörterbücher als Ausgabe.Wie mit riesigen (~ 3 GB) XML zu behandeln, analysieren Sie es in JSON in Python. Verwenden Sie xml.etree, um darüber zu iterieren, aber Speicherfehler

Da die Größe dieser endgültigen Liste von Wörterbüchern je nach Daten sehr groß sein kann, möchte ich die Länge dieser Liste notieren und nach einem bestimmten Wert schreibe sie als json und mach weiter.

Obwohl Code tut, was es soll, aber es gibt Speicherfehler, obwohl ich >> del praktisch nutzlos versuchte. Ich verstehe, dass Python den Speicher nicht wirklich zum os zurückbringt und eine neue Referenz in der Schleife sollte automatisch (schließlich) damit umgehen.

Bitte lassen Sie mich wissen, was Speicherprobleme verursacht und wie man es effizient macht.

parser = ET.iterparse(file_name, events = ["start","end"]) 

l= [] 
len_list = 0 
file_num = 1 

for event, element in parser: 
    if element.tag == "tag1" and event == "start": 
     dic = {} 
     dic["@id"] = element.attrib["id"] 
     dic["label"] = {} 
     dic["description"] = {} 
     dic["relations"] = {} 

    if element.tag == "tag2" and event == "start": 
     lang = element.attrib.values()[0] 
     dic["label"][lang] = [] 

    if element.tag == "tag3" and event == "start": 
     dic["label"][lang].append(element.text) 

    if element.tag == "tag1" and event == "end": 
     l.append(dic) 
     del dic 
     del lang 
     len_list += 1 

    if len_list == 5000: 
     print "writing file: " + str(file_num) 
     iate_json = {"entities": l} 
     with open(path_to_output_dir + str(file_num) + ".json",'w') as outfile: 
      json.dump(iate_json, outfile, indent = 4) 

     del l 
     l = [] 
     len_list = 0 
     file_num += 1 

iate_json = {"entities": l} 
with open(path_to_output_dir + str(file_num) + ".json",'w') as outfile: 
    json.dump(iate_json, outfile, indent = 4) 

Lassen Sie mich beide Fehler im Code und auch jeden anderen optimalen Weg, um die gleiche Aufgabe zu erreichen. Danke

Antwort

0

Wenn jemand noch auf dieses Problem kämpft, fügte ich element.clear() nach jeder Instanz ich erfassen das Element.

Obwohl es an vielen Orten erwähnt wird, aber ich bin immer noch zu finden, einige Ressource, wo es erklärt, wie xml.etree Speicher intern behandeln. Alle Leads werden geschätzt.

Vielen Dank