Witam wszystkich. Mam dość nietypowy problem, może się ktoś zetknął, ewentualnie ma pomysł jak go rozwiązać.
Mianowicie, potrzebuję w możliwie najszybszy sposób sparsować dużą ilość adresów url. Z tego co się zdążyłem zorientować najlepiej się nadaje do tego Typhoeus. Zrobiłem coś takiego:
def run file
log = Logger.new(‘log’)
hydra = Typhoeus::Hydra.new(:max_concurrency => 30)
hydra.disable_memoization
File.open(file).each do |url|
begin
request = Typhoeus::Request.new(url.strip, :method => :get, :follow_location => true)
request.on_complete do |resp|
detect_url(url, resp.body)
end
puts “queuing #{ url }”
hydra.queue(request)
rescue Exception => e
log.error e
end
end
hydra.run
end
Ten kod działa idealnie, aczkolwiek wraz z czasem zużycie pamięci rośnie aż do jej wyczerpania. Postanowiłem więc przerobić skrypt tak aby było coś w rodzaju ‘kolejki do kolejki’.
def run file, concurrency
log = Logger.new(‘log’)
queue = []
File.open(file).each do |uri|
queue << uri
begin
hydra = Typhoeus::Hydra.new(:max_concurrency => concurrency)
hydra.disable_memoization
queue.each do |url|
request = Typhoeus::Request.new(url.strip, :method => :get, :follow_location => true)
request.on_complete do |resp|
detect_url(url, resp.body)
puts “#{url} code: #{resp.code}”
end
puts “queuing #{ url }”
hydra.queue(request)
end
puts ‘hydra run’
hydra.run
queue = []
rescue Exception => e
log.error e
end if queue.size == concurrency * 5
end
end
Tym razem to działa średnio do pierwszego tysiąca adresów. Później nie wiedzieć czemu po prostu przestaje pobierać nowe adresy, nie wykrzacza się, w logach nic nie ma. Nie mam pojęcia co może być nie tak. Skrypt pozostaje uruchomiony jako proces ale przestaje robić cokolwiek. Z góry dziękuję za wszelkie sugestie i pomysły.