2012-02-16 10 views
5

yo estaba tratando de rascar algo de información de una página web a página, básicamente, esto es lo que hice:de error "Memoria insuficiente" con mecanizar

import mechanize 
MechBrowser = mechanize.Browser() 

Counter = 0 

while Counter < 5000: 
    Response = MechBrowser.open("http://example.com/page" + str(Counter)) 
    Html = Response.read() 
    Response.close() 

    OutputFile = open("Output.txt", "a") 
    OutputFile.write(Html) 
    OutputFile.close() 

    Counter = Counter + 1 

Bueno, los códigos anteriores terminó tirar "Fuera de "Error de memoria" y en el administrador de tareas muestra que el script usó casi 1GB de memoria después de varias horas corriendo ... ¿cómo es que?

¿Alguien me diría qué salió mal?

+2

Lo primero que trataría de descartar es que mechanize está perdiendo memoria, simplemente use 'urllib2.urlopen()' en su lugar. –

+3

Al igual que una nota, es mucho más pitónico hacer '' para contador en rango (5000): ''. Y PEP8 recomienda low_case_with_underscores para nombres de variables, mientras que CamelCase está reservado para clases. Además, consulte '' with'' para escribir/leer en/desde archivos. –

+2

(a) Este tipo de pregunta "¿Qué pasa con mi código?" Es mejor en la revisión de código (b) la reutilización variable ya que tal no es el problema (c) Obtenga información sobre el perfil de memoria. – Marcin

Respuesta

13

Esto no es exactamente una pérdida de memoria, sino una característica no documentada. Básicamente, mechanize.Browser() está almacenando colectivamente todo el historial del navegador en la memoria a medida que avanza.

Si agrega una llamada al MechBrowser.clear_history() después de Response.close(), debería resolver el problema.

Cuestiones relacionadas