【发布时间】:2011-10-03 21:01:10
【问题描述】:
我有一个 Rails 应用程序,它处理 mysql 数据库中的大量(数百万)条记录。一旦它开始工作,它的内存使用量就会以每秒 50MB 的速度快速增长。使用像 oink 这样的工具,我能够将根本原因缩小到一个循环,该循环遍历数据库中一张大表中的所有记录。
我知道如果我使用像 Person.all.each 这样的东西,所有的记录都会被加载到内存中。但是,如果我切换到 find_each,我仍然会看到相同的内存问题。为了进一步隔离问题,我创建了以下测试控制器,它除了循环记录之外什么都不做。我想 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
谢谢!
【问题讨论】:
-
我猜ActiveRecord中有一个叫做
find_in_batches的函数。可能有助于控制内存爆发。 -
我也是这么想的,不过,
find_each似乎在幕后使用了find_in_batches。也许每一行都很大并且可以从:batch_size选项中受益(默认为 1000 行) -
需要循环遍历每条记录的代码实际上在做什么?
标签: ruby-on-rails ruby-on-rails-3 activerecord memory-leaks