Я использую рубин httpclient gem для загрузки больших файлов. В идеале я хочу иметь возможность загружать файлы размером до 2 ГБ. Когда я загружаю файлы, я не хочу загружать содержимое файла в память по очевидной причине, поэтому я использую API get_content HTTPClient следующим образом, а затем записываю куски, которые передаются в блок, в файл
HTTPClient.new.get_content(url) do |chunk|
puts "Downloaded chunk of size #{chunk.size}"
file.write(chunk)
end
Это крайне медленно. 10 МБ файл может легко занять 30 секунд.
Положения в блоке продолжают распечатывать размер блока следующим образом,
Downloaded chunk of size 12276
Downloaded chunk of size 4108
Downloaded chunk of size 12276
Downloaded chunk of size 4108
Downloaded chunk of size 12276
Downloaded chunk of size 4108
Downloaded chunk of size 12276
Downloaded chunk of size 4108
Downloaded chunk of size 12276
Если вы посмотрите на размер фрагмента 4108/12276, кажется, что это может быть проблемой. Размеры куска действительно маленькие. Я не мог понять, как увеличить размеры куска.
Я использовал Patron, который основан на libcurl, и он довольно быстр при загрузке, но я пока не сильно заинтересован в введении зависимости от libcurl.
Как я могу ускорить загрузку HTTPClient?
ОБНОВЛЕНИЕ 10/27/2011
Я попробовал два предложения от @NaHi, и вот что я нашел.
Когда я установил для параметра transparent_gzip_decompression значение true, я получил следующее исключение
Zlib::StreamError: stream error: invalid window bits
from /Users/<user>/.rvm/gems/jruby-1.6.2@share/gems/httpclient-2.2.0.2/lib/httpclient/session.rb:652:in `get_body'
from /Users/<user>/.rvm/gems/jruby-1.6.2@share/gems/httpclient-2.2.0.2/lib/httpclient.rb:1062:in `do_get_block'
from /Users/<user>/.rvm/gems/jruby-1.6.2@share/gems/httpclient-2.2.0.2/lib/httpclient.rb:866:in `do_request'
from /Users/<user>/.rvm/gems/jruby-1.6.2@share/gems/httpclient-2.2.0.2/lib/httpclient.rb:953:in `protect_keep_alive_disconnected'
from /Users/<user>/.rvm/gems/jruby-1.6.2@share/gems/httpclient-2.2.0.2/lib/httpclient.rb:865:in `do_request'
from /Users/<user>/.rvm/gems/jruby-1.6.2@share/gems/httpclient-2.2.0.2/lib/httpclient.rb:938:in `follow_redirect'
from /Users/<user>/.rvm/gems/jruby-1.6.2@share/gems/httpclient-2.2.0.2/lib/httpclient.rb:577:in `get_content'
Когда я установил заголовок «Accept-Encoding» => «gzip, deflate», я увидел улучшение производительности. Файл 7296502 байтов, который раньше занимал 24 секунды, теперь занимает 16 секунд. Так что это помогает. Для сравнения, patron загружает тот же файл за 1,5 секунды. Так что я все еще далек от достижения такой же производительности с httpclient .