2012-02-16 8 views
5

Esto causará problemas de memoria con Ruby. Sé que Open-URI escribe en un TempFile si el tamaño supera los 10 KB. ¿Pero intentará HTTParty guardar todo el PDF en la memoria antes de escribir en TempFile?Problemas de memoria con HTTParty y descarga archivos de gran tamaño

src = Tempfile.new("file.pdf") 
src.binmode 
src.write HTTParty.get("large_file.pdf").parsed_response 
+0

HTTParty no estaba destinado a la descarga de archivos PDF. Es un cliente API diseñado para pequeños intercambios XML o JSON. –

+0

Entonces, ¿qué debo hacer aquí? – maletor

+1

¿Qué pasa con Open-URI? Una alternativa que usa Net :: HTTP está en mi respuesta a continuación. –

Respuesta

11

Puede usar Net :: HTTP. Consulte the documentation (en particular, la sección titulada "Cuerpos de respuesta de transmisión").

Aquí está el ejemplo de los documentos:

uri = URI('http://example.com/large_file') 

Net::HTTP.start(uri.host, uri.port) do |http| 
    request = Net::HTTP::Get.new uri.request_uri 

    http.request request do |response| 
    open 'large_file', 'w' do |io| 
     response.read_body do |chunk| 
     io.write chunk 
     end 
    end 
    end 
end 
+1

¡Impresionante! Pregunta algo relacionada, pero ¿cómo estás haciendo esto para tus grandes cargas de archivos? – maletor

+4

También podría ser mejor si abre un archivo para escribir en modo binario, simplemente agregue el indicador 'b', como:' abrir (nombre de archivo, 'wb') {| io | ...} '. –

+0

No lo depuré profundamente, pero parece que se descarga "en segundo plano" mientras el programa se ejecuta más. – Nakilon

Cuestiones relacionadas