Проблемы с памятью с HTTParty и загрузка больших файлов

Это вызовет проблемы с памятью в Ruby. Я знаю, что Open-URI записывает в TempFile, если размер превышает 10 КБ. Но попытается ли HTTParty сохранить весь PDF-файл в памяти, прежде чем он запишется в TempFile?

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

person maletor    schedule 16.02.2012    source источник
comment
HTTParty не предназначен для загрузки PDF-файлов. Это клиент API, предназначенный для небольших обменов XML или JSON.   -  person Mark Thomas    schedule 16.02.2012
comment
Что не так с Open-URI? Альтернатива с использованием Net::HTTP приведена в моем ответе ниже.   -  person Mark Thomas    schedule 16.02.2012


Ответы (1)


Вы можете использовать Net::HTTP. См. документацию (в в частности, раздел под названием «Тело потокового ответа»).

Вот пример из документов:

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
person Mark Thomas    schedule 16.02.2012
comment
Потрясающий! Несколько связанный вопрос, но как вы это делаете для загрузки больших файлов? - person maletor; 16.02.2012
comment
Также может быть лучше, если вы откроете файл для записи в двоичном режиме, просто добавьте флаг b, например: open(filename, 'wb') { |io| ... }. - person Dan K.K.; 21.02.2014
comment
Глубоко не отлаживал, но кажется, что он загружается в фоновом режиме, пока программа работает дальше. - person Nakilon; 19.09.2016