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
Ihr erstes Problem ist das: 'data = file.read()'. Dort lesen Sie das gesamte Ergebnis in Erinnerung. – dsh
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