Tengo un programa de Python que recopila feeds de productos afiliados y los guarda como un archivo xml. Algunos de esos feeds de productos son realmente grandes, lo que resulta en un error de falta de memoria. Este es mi código donde sucede:

xmlfile = urllib2.urlopen(feed.URL)
log.info("Opened the file")
contents = xmlfile.read()
log.info("Read the file")
xmlfile.close()

"Abrir el archivo" es lo último que se registra, por lo que leer el archivo es lo que requiere tanta memoria. No puedo hacer nada sobre el tamaño del archivo. Además, ejecuto Python 2.7.8 de 64 bits. Eso significa que puedo usar 4 GB de RAM ¿verdad? El tamaño del archivo es de 450 MB, no hay otros subprocesos en ejecución, no hay archivos abiertos. ¿Cómo puede tomar tanta memoria?

0
SergioP 2 sep. 2014 a las 19:56

2 respuestas

La mejor respuesta

Lo que quería no es analizar el archivo sino guardarlo directamente. Esto hizo el truco:

import urllib

testfile = urllib.URLopener()
testfile.retrieve("http://randomsite.com/file.gz", "file.gz")
1
SergioP 3 sep. 2014 a las 09:08

En lugar de leer todo el documento XML en la memoria antes de analizarlo, transmítalo desde la web y analice las piezas a medida que entren. Doc: https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse

Gracias a @tdelaney por la aclaración.

Fuente

import urllib
import xml.etree.ElementTree as ET

URL = 'http://www.w3schools.com/xml/note.xml'
for event,elem in ET.iterparse( urllib.urlopen(URL) ):
    print event, elem.__dict__

Salida

end {'text': 'Tove', 'attrib': {}, 'tag': 'to', 'tail': '\n\t', '_children': []}
end {'text': 'Jani', 'attrib': {}, 'tag': 'from', 'tail': '\n\t', '_children': []}
end {'text': 'Reminder', 'attrib': {}, 'tag': 'heading', 'tail': '\n\t', '_children': []}
end {'text': "Don't forget me this weekend!", 'attrib': {}, 'tag': 'body', 'tail': '\n', '_children': []}
end {'text': '\n\t', 'attrib': {}, 'tag': 'note', '_children': [<Element 'to' at 0x1968a10>, <Element 'from' at 0x1968a50>, <Element 'heading' at 0x1968b10>, <Element 'body' at 0x1968bd0>]}
3
johntellsall 2 sep. 2014 a las 19:47