Sto utilizzando rest-client per scaricare pagine di grandi dimensioni (circa 1,5 GB di dimensioni). Il valore recuperato viene memorizzato in memoria rispetto a quello salvato in un file. Come risultato il mio programma si blocca con failed to allocate memory (NoMemoryError)
.Utilizzo di rest-client per scaricare un file su disco senza caricare tutto in memoria prima
Tuttavia, non è necessario conservare questi dati in memoria, potrebbe persino essere salvato direttamente su disco.
Ho trovato "È possibile: (...) gestire manualmente la risposta (ad esempio per operare su di esso come un flusso piuttosto che leggerlo tutto in memoria) Vedere la documentazione di RestClient :: Request per ulteriori informazioni." su https://github.com/rest-client/rest-client Purtroppo dopo aver letto http://www.rubydoc.info/gems/rest-client/1.7.3/RestClient/Request non ho idea di come possa essere realizzato.
Sono anche consapevole del fatto che potrei utilizzare un'altra libreria (Using WWW:Mechanize to download a file to disk without loading it all in memory first) ma il mio programma sta già utilizzando rest-client.
codice semplificato:
data = RestClient::Request.execute(:method => :get, :url => url, :timeout => 3600)
file = File.new(filename, 'w')
file.write data
file.close
http://www.rubydoc.info/gems/rest-client/1.7.3/RestClient/Request#fetch_body-instance_method leggere le fonti di questo metodo e attuare smth come questo, ma a memorizzare i dati direttamente nel file. – iced
È possibile utilizzare la libreria integrata OpenURI: 'require 'open-uri'; File.open (percorso, 'w') {| f | IO.copy_stream (open (url), f)} '. Se il file è di grandi dimensioni 'open' lo scriverà automaticamente su un Tempfile e ritornerà. Se il file è abbastanza piccolo, lo scriverà in un 'StringIO'. In entrambi i casi si avrà un oggetto io che è possibile copiare in blocco nella posizione desiderata. –
Hai risolto questo problema con RestClient? Ho un problema simile ma non posso usare open-uri poiché non supporta le richieste POST. – Raoot