Niedawno zacząłem uczyć się o robotach sieciowych i zbudowałem próbny robot z Ruby, Anemone i Mongodb do przechowywania. Testuję robota na ogromnej publicznej stronie z prawdopodobnie miliardami linków.Ruby, Mongodb, Anemone: robota sieciowego z możliwym wyciekiem pamięci?
Crawler.rb indeksuje poprawne informacje, chociaż kiedy sprawdzam użycie pamięci w monitorze aktywności, pokazuje ona stale rosnącą pamięć. Uruchomiłem przeszukiwacz tylko na około 6-7 godzin, a pamięć pokazuje 1,38 GB dla mongody i 1,37 GB dla procesu Ruby. Wydaje się, że rośnie około 100 MB co godzinę.
Wygląda na to, że mogę mieć wyciek pamięci? Czy jest to bardziej optymalny sposób, w jaki mogę osiągnąć to samo indeksowanie bez utraty kontroli nad pamięcią, aby mogła działać dłużej?
# Sample web_crawler.rb with Anemone, Mongodb and Ruby.
require 'anemone'
# do not store the page's body.
module Anemone
class Page
def to_hash
{'url' => @url.to_s,
'links' => links.map(&:to_s),
'code' => @code,
'visited' => @visited,
'depth' => @depth,
'referer' => @referer.to_s,
'fetched' => @fetched}
end
def self.from_hash(hash)
page = self.new(URI(hash['url']))
{'@links' => hash['links'].map { |link| URI(link) },
'@code' => hash['code'].to_i,
'@visited' => hash['visited'],
'@depth' => hash['depth'].to_i,
'@referer' => hash['referer'],
'@fetched' => hash['fetched']
}.each do |var, value|
page.instance_variable_set(var, value)
end
page
end
end
end
Anemone.crawl("http://www.example.com/", :discard_page_bodies => true, :threads => 1, :obey_robots_txt => true, :user_agent => "Example - Web Crawler", :large_scale_crawl => true) do | anemone |
anemone.storage = Anemone::Storage.MongoDB
#only crawl pages that contain /example in url
anemone.focus_crawl do |page|
links = page.links.delete_if do |link|
(link.to_s =~ /example/).nil?
end
end
# only process pages in the /example directory
anemone.on_pages_like(/example/) do | page |
regex = /some type of regex/
example = page.doc.css('#example_div').inner_html.gsub(regex,'') rescue next
# Save to text file
if !example.nil? and example != ""
open('example.txt', 'a') { |f| f.puts "#{example}"}
end
page.discard_doc!
end
end
Czy wymyśliłeś przyczynę wycieku? Jeśli uważasz, że to błąd w Anemone, czy zgłosiłeś to na swoim [trackerze problemów] (https://github.com/chriskite/anemone/issues)? –
Powiązane problemy wymienione w module śledzenia problemów z anemonem to: [wyciek pamięci?] (Https://github.com/chriskite/anemone/issues/49), [wyciek pamięci lub niewydajna obsługa pamięci] (https://github.com/chriskite/anemone/issues/29) i [Napraw błędy OutOfMemory dla dużych witryn] (https://github.com/chriskite/anemone/pull/30) –
Zgłosiłem to w tym samym czasie, co publikowanie tutaj na SO. Udało mi się zaindeksować to, co wymagało moje zadanie, dodając sugerowane poprawki, co spowodowało, że moje indeksowanie trwało znacznie dłużej, chociaż zużycie pamięci RAM rosło stale, ale nie tak szybko, jak było wcześniej. Nadal nie jestem pewien, co powoduje wyciek pamięci. – viotech