2016-03-22 4 views
0

Der folgende Python-Code funktioniert gut, wenn ich ihn für ein Test-Dataset von ein paar tausend Datensätzen verwende, aber wenn ich es mit einem Xml von etwa 400 MB probeweise ausprobiere, hat es zu wenig Speicher. Gibt es eine Möglichkeit, es Zeile für Zeile lesen zu lassen?Lesen von XML aufgrund der Größe fehlgeschlagen - kann es zeilenweise in Python gelesen werden?

import urllib 
import xml.etree.ElementTree as ET 

url = raw_input('Enter - ') 

value,count,total, counts =0,0,0, dict() 

print "Retrieving: ", url 
file=urllib.urlopen(url) 
data=file.read() 
print 'Retrieved',len(data),'characters' 
xml=ET.fromstring(data) 
tags=xml.findall('.//Postcode') 
for tag in tags: 
# print tag.text 
    count+=int(tag.text) 
print 'Count: ', len(tags) 
print 'Sum: ', count 

Dies wird zu sqlite3 schreiben, aber nicht mit einem Speicherfehler auf Tests (bevor es zum Prozess DB Schreibens erhält, die in dem obigen Beispielcode nicht enthalten ist).

Die Daten, die ich zu lesen versuche frei von http://data.gov.au/dataset/abn-bulk-extract

+0

Ihr erstes Problem ist das: 'data = file.read()'. Dort lesen Sie das gesamte Ergebnis in Erinnerung. – dsh

+2

Sehen Sie sich https://docs.python.org/3/library/xml.etree.elementtree.html#pull-api-for-non-blocking-parsing an und verweist auf [iterparse] (https: // docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse). Anscheinend können Sie das dateiähnliche Objekt, das von urlopen zurückgegeben wurde, an ElementTree.iterparse() übergeben, um das zu tun, was Sie brauchen. – dsh

Antwort

0

Welche Teil versagt haben heruntergeladen werden? Die Datei.read() oder ET.fromstring?

Einfache Lösung (neben mehr Speicher kaufen) wäre die abgerufenen Datei zu speichern und verwendet ET.parse (Dateinamen) als String in dem Speicher liest das XML zu vermeiden.

Andere Fall ist, Xml.sax API zu verwenden, die XML nicht zur gleichen Zeit analysieren.

+0

Das "print 'Abgerufene, len (data),' characters '" funktioniert so, dass es danach versagt. Ich bekomme einen nicht ausreichenden Speicherfehler. I 16 GB RAM und mindestens 500 GB frei auf meinen Laufwerken so ... Es wird die Datei aus meiner Festplatte zu lesen (so habe ich bereits heruntergeladen es) – GeorgeC

+0

wenn ich versuche, „xml = ET.parse (url)“ Ich bekomme >> Datei "C: \ Python27 \ ArcGIS10.4 \ lib \ xml \ etree \ ElementTree.py", Linie 653, in Parse data = source.read (65536) Memory Das Problem versucht, die Datenmenge zu verbrauchen Zeile für Zeile oder ich denke, einen Weg gefunden, um in ein paar Stücke von 50Mb jeder ... – GeorgeC

Verwandte Themen