Rubyで多数のファイルをダウンロードするときはHTTPセッションを使いまわした方がお得な話

Rubyで多数のファイルをダウンロードするときはHTTPセッションを使いまわした方がお得な話

仕事とは関係のないところでちまちまとRubyを使って遊び始めてみました。
さて、標題の件なんですが、最初はこんな感じで書いていました。

# {
#     :url => 'http://www.example.com/foo/bar.jpg',
#     :file => '/path/to/foo/bar.jpg'
# }
# こんな感じのハッシュが配列になってる想定で
list.each do |item|
    open(item[:url]) do |data|
        open(item[:file]) do |file|
            file.write(data.read)
        end
    end
end

件数にもよるとは思いますが、これだと毎回HTTPセッションを開いてダウンロードして書き込み、という処理を繰り返すことになるんですね。
今回のケースではダウンロード元が同じドメインだったので次のように変更してみました。

# {
#     :path => '/foo/bar.jpg',
#     :file => '/path/to/foo/bar.jpg'
# }
# こんな感じのハッシュが配列になってる想定で
Net::HTTP.start('www.example.com') do |http|
	list.each do |item|
		request = Net::HTTP::Get.new(item[:path])
		response = http.request(request)
		open(item[:file], 'wb') do |file|
			file.write(response.body)
		end
	end
end

大きな違いは最初にHTTPセッションを作ったあとに使いまわしているところですね。
ダウンロード元のサーバに影響されるので一概には言えないのですが、目に見えて速度が改善されました。
同じドメインから、という制限付きではありますが「こうかはばつぐんだ!」となるので条件さえあうならこちらの方法が良いんじゃないかなーと思います。

TAG

  • このエントリーをはてなブックマークに追加
やまま
スペシャリスト やまま yamama

マンガとアニメとゲームから錬成された宇宙大好きエンジニア。 軌道エレベーターで行ける静止軌道上のコロニーに住まいを移し、ゲームやってマンガ読んでアニメ見て爆睡、ゲームやってマンガ読んでアニメ見て爆睡、という生活を夢見ながら今日もコードを書き続けるのだった。