gpt4 book ai didi

ruby - 跟踪 Ruby 代码中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:53 27 4
gpt4 key购买 nike

我不是追查这些事情的专家,但下面的事情似乎是问题的根源,只是想检查我是否正确,以及如何处理它:

所有脚本基本上都是一个大循环,每次迭代都执行以下操作,我认为可能与泄漏有关:

  1. Mechanize 对象用于获取远程页面
  2. 调用一个函数来获取或初始化 AR 对象,但这发生在同名变量上
  3. 总是初始化另外两个对象,但相应地使用相同的名称

我认为,由于新创建的对象被分配给同名变量,垃圾收集机制应该处理这个问题......


更新:我的代码的简化版本

runner.rb 每天由 cronjob 运行,它基本上生成其他脚本列表 - 蜘蛛:

['spider1_path', 'spider2_path', .. ].each do |spider_path|
Process.detach( fork { exec "ruby #{spider_path}" } )
end

蜘蛛.rb

# This is the main bit
#
agent = Mechanize.new { |agent|
agent.user_agent_alias = 'Mac Safari'
}

categories_urls = get_list_of_categories_links_for_website('a')
categories_urls.each do |category_url|
next_page = category_url
while next_page
doc = fetch_page( next_page, agent )
cat_page = CategoryPage.new( doc )
urls_of_sub_pages = cat_page.get_urls_of_sub_pages

urls_of_sub_pages.each do |url|
page_doc = fetch_page( url, agent )
sub_page = SubPage.new( page_doc )
sub_page.parse!
sub_page.insert
end
next_page = cat_page.get_next_page
# this bit bellow didn't help
GC.start
end
end

...

def fetch_page( a, url )
a.get url
end

...

class SubPage
...
def parse!
# @doc - result of `fetch_page`
@parser = @doc.parser
# do some scraping using @parser
# accumulate @attrs hash with necessary information
end
...

def insert
ad = Ad.where('advert_id = ?', @attrs['advert_id']).first
if ad
ad.update_attributes( @attrs )
else
ad = Ad.create(@attrs)
end
end
end

最佳答案

您是否尝试过在调用 GC.start 时偶尔手动触发垃圾收集?我发现在某些情况下,Ruby 会变得 super 懒惰,不会去倒垃圾。

Ruby 通常不会“泄漏”内存,但如果您不小心将它们缓存在某个地方,它可能会累积大量已分配的对象。

关于ruby - 跟踪 Ruby 代码中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com