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

如果我使用Person之类的东西,我就能理解.全部的每个,所有记录都将加载到内存中.然而,如果我切换到查找每个,我仍然会看到相同的内存问题.为了进一步隔离问题,我创建了下面的测试控制器,它只在记录中循环.我想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相关问答推荐

比较 Rails 中的日期

将日期时间转换为月、日和年?

在哈姆尔与当地人进行局部渲染?

撬Ruby 如何重新加载?

PostgreSQL 无间隙序列

使用 Rspec 测试 Rails 3.1 可安装引擎

从 Authlogic 迁移到 Devise

使用 Ruby on Rails 从原始 IP 地址获取用户国家名称

具有条件的列的计数器缓存?

Phusion 乘客(适合傻瓜!)

不允许请求来源:使用 Rails5 和 ActionCable 时的 http://localhost:3001

设计自定义路由和登录页面

获取磁盘上 ActiveStorage 文件的路径

Rails HABTM - 正确删除关联

设计:在注册期间禁用密码确认

rbenv:没有 gemsets 生存

默认情况下 haml

Rails:为什么 with_exclusive_scope 受保护?关于如何使用它的任何好的做法?

我什么时候需要在 Rails 中重新启动服务器?

无论何时 gem 在 Heroku 上运行 cron 作业(job)