2012-02-16 16 views
5

Ciò causerà problemi di memoria con Ruby. So che Open-URI scrive su un TempFile se le dimensioni superano i 10 KB. Ma HTTParty cercherà e salverà l'intero PDF in memoria prima che scriva su TempFile?Problemi di memoria con HTTParty e download di file di grandi dimensioni

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

HTTParty non era destinato per il download di file PDF. È un client API progettato per piccoli scambi XML o JSON. –

+0

Quindi cosa dovrei fare qui? – maletor

+1

Cosa c'è che non va con Open-URI? Un'alternativa che utilizza Net :: HTTP è nella mia risposta di seguito. –

risposta

11

È possibile utilizzare Net :: HTTP. Vedere the documentation (in particolare la sezione intitolata "Streaming Response Bodies").

Ecco l'esempio dalla documentazione:

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

Fantastico! Domanda un po 'correlata, ma come stai facendo questo per i tuoi upload di file di grandi dimensioni? – maletor

+4

Potrebbe anche essere meglio se apri il file per scrivere in modalità binaria, semplicemente aggiungi il flag 'b', come:' open (filename, 'wb') {| io | ...} '. –

+0

Non ha eseguito il debug in profondità ma sembra che venga scaricato "in background" mentre il programma viene eseguito ulteriormente. – Nakilon

Problemi correlati