ruby-on-rails - Rails rake 任务在运行时不断消耗更多 RAM(使用 Mechanize 抓取网站)

标签 ruby-on-rails memory-leaks rake mechanize web-crawler

我使用 Mechanize gem 来抓取网站。我在 Rails rake 任务中编写了一个非常简单的单线程爬虫,因为我需要访问 Rails 模型。

爬虫运行得很好,但在观察它运行一段时间后,我可以看到它随着时间的推移消耗越来越多的 RAM,这很糟糕。

我使用 God gem 来监控我的爬虫。

下面是我的 rake 任务代码,我想知道它是否有任何内存泄漏的可能性?

task :abc => :environment do
  prefix_url = 'http://example.com/abc-'
  postfix_url = '.html'
  from_page_id = (AppConfig.last_crawled_id || 1) + 1
  to_page_id = 100000

  agent = Mechanize.new
  agent.user_agent_alias = 'Mac Safari'

  (from_page_id..to_page_id).each do |i|
    url = "#{prefix_url}#{i}#{postfix_url}"
    puts "#{Time.now} - Crawl #{url}"
    page = agent.get(url)

    page.search('#content > ul').each do |s|
      var = s.css('li')[0].text()
      value = s.css('li')[1].text()
      MyModel.create :var => var, :value => value
    end

    AppConfig.last_crawled_id = i
  end
  # Finish crawling, let's stop
  `god stop crawl_abc`
end

最佳答案

除非您拥有最新版本的 mechanize(2.1.1 仅在一天前发布)默认情况下 mechanize 以无限的历史记录大小运行,即它保留您访问过的所有页面,因此将逐渐使用越来越多的页面内存。

在您的情况下,这没有任何意义,因此请调用 max_history=在您的代理上应该限制以这种方式使用的内存量

关于ruby-on-rails - Rails rake 任务在运行时不断消耗更多 RAM(使用 Mechanize 抓取网站),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9143295/

相关文章:

ruby-on-rails - ruby 中嵌套数组中哈希键的总和

ruby-on-rails - Rails Ajax 单行 RJS 文件

objective-c - UIToolbar内存泄漏

ruby-on-rails - File.open,写入并保存?

ruby-on-rails - Rails/Ember-active_model_serializer-侧面加载时未定义的方法 `object'

ruby-on-rails - 使用 Ruby on Rails 安装 CMS 引擎。 (机车)

c - 从C中的链表中释放内存

sqlite sqlite3_close()不会释放获取的内存

ruby - 如何让 Rake 使用 RVM 的 Ruby?

ruby-on-rails - Rails Rake 任务显示执行过期消息并且程序已停止