Ruby, Mongodb, Anemone: поисковый робот с возможной утечкой памяти?

Недавно я начал изучать поисковые роботы, и я создал образец краулера с Ruby, Anemone и Mongodb для хранения. Я тестирую краулер на большом общедоступном веб-сайте с, возможно, миллиардами ссылок.

Crawler.rb индексирует правильную информацию, хотя, когда я проверяю использование памяти в мониторе активности, он показывает, что объем памяти постоянно увеличивается. Я запускал краулер только около 6-7 часов, а память показывает 1,38 ГБ для mongod и 1,37 ГБ для процесса Ruby. Кажется, что он растет примерно на 100 МБ каждый час или около того.

Кажется, у меня может быть утечка памяти? Является ли это более оптимальным способом достижения того же сканирования без чрезмерного увеличения объема памяти, чтобы он мог работать дольше?

# 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

7
задан viotech 24 February 2012 в 02:03
поделиться