2016-03-22 12 views
0

Aşağıdaki python kodu, birkaç bin kayıttan oluşan bir sınama veri kümesinde kullandığımda iyi çalışıyor ancak yaklaşık 400 MB xml ile denediğimde bellek bitti. Satır satır okumak için bir yolu var mı? Boyutu nedeniyle xml okuma başarısız olabilir -can python satır satır okunabilir mi?

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 

Bu

sqlite3 yazma ama (o örnek kodda yukarıda bulunmayanlar DB yazma işlemine girmeden önce) testlere bir bellek hatası ile başarısız olur.

özgürce başarısız Hangi parçası

+0

İlk sorunun şudur: 'data = file.read()'. Tüm sonucu hafızaya okuyorsunuz. – dsh

+2

https://docs.python.org/3/library/xml.etree.elementtree.html#pull-api-for-non-blocking-parsing adresine bakın ve [iterparse] referansını (https: // docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse). İhtiyacınız olanı yapmak için urlopen'den döndürülen dosya benzeri nesneyi ElementTree.iterparse() öğesine aktarabilirsiniz. – dsh

cevap

0

http://data.gov.au/dataset/abn-bulk-extract indirilebilir okumaya çalışıyorum bilgi? File.read() veya ET.fromstring?

Kolay çözüm (daha fazla bellek satın almanın yanı sıra), alınan dosyayı kaydetmek ve XML'i bir bellek dizesi olarak okumaktan kaçınmak için ET.parse (dosya adı) kullanmak olacaktır.

Diğer örnek, XML'yi aynı anda ayrıştırmayan xml.sax API'sini kullanmaktır.

+0

"Yazdırıldı" Alındı, len (veriler), 'karakterler' ”bundan sonra başarısız oluyor. Hafıza hatası aldım. Benim sürücülerimde 16GB RAM ve en az 500GB ücretsiz var, bu yüzden ... "xml = ET.parse (url)" denediğimde sabit diskimdeki dosyayı okuyor (bu yüzden zaten indirdim) – GeorgeC

+0

" >> Dosya "C: \ Python27 \ ArcGIS10.4 \ lib \ xml \ etree \ ElementTree.py", satır 653, ayrıştırma data = source.read (65536) MemoryError Sorun, veri kümesini tüketmeye çalışıyor satır satır veya sanırım her biri 50Mb bir çift parçalar içine parçalamak için bir yol bulmak ... – GeorgeC