gpt4 book ai didi

ruby-on-rails - Ruby on Rails 循环大量记录时出现内存泄漏; find_each 没有帮助

转载 作者:行者123 更新时间:2023-12-01 18:03:29 24 4
gpt4 key购买 nike

我有一个 Rails 应用程序,可以处理 mysql 数据库中的大量(数百万)条记录。一旦开始工作,其内存使用量就会以每秒 50MB 的速度快速增长。使用 oink 等工具,我能够将根本原因缩小到一个循环,该循环遍历数据库中一个大表中的所有记录。

我知道如果我使用像Person.all.each这样的东西,所有记录都会被加载到内存中。但是,如果我切换到 find_each,我仍然会看到相同的内存问题。为了进一步隔离问题,我创建了以下测试 Controller ,它除了循环记录之外什么也不做。我想 find_each 每次只在内存中保留少量对象,但内存使用量会随着执行而线性增长。

class TestController < ApplicationController
def memory_test
Person.find_each do |person|
end
end

我怀疑这与 ActiveRecord 缓存查询结果有关。但我检查了我的环境设置,并且在开发中将所有与缓存相关的选项设置为 false(我正在使用 Rails 创建的默认设置)。我在网上进行了一些搜索,但找不到解决方案。

我使用的是 Rails 3.1.0 rc1 和 ruby​​ 1.9.2

谢谢!

最佳答案

我自己解决了这个问题。有两个地方需要改变。

首先,禁用 IdentityMap。在config/application.rb中

config.active_record.identity_map = false

其次,使用uncached来结束循环

class MemoryTestController < ApplicationController
def go
ActiveRecord::Base.uncached do
Person.find_each do |person|
# whatever operation
end
end
end
end

现在我的内存使用得到了控制。希望这对其他人有帮助。

关于ruby-on-rails - Ruby on Rails 循环大量记录时出现内存泄漏; find_each 没有帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668875/

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