加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – ActiveRecord批量数据,内存永远增长

发布时间:2020-12-17 02:00:43 所属栏目:百科 来源:网络整理
导读:我正在使用ActiveRecord将一些数据从一个数据库中的表批量迁移到另一个数据库中的另一个表.大约400万行. 我正在使用find_each批量获取.然后我为每个读取的记录做一些逻辑,并将其写入不同的数据库.我已经尝试过直接逐一编写,并使用nice activerecord-import g
我正在使用ActiveRecord将一些数据从一个数据库中的表批量迁移到另一个数据库中的另一个表.大约400万行.

我正在使用find_each批量获取.然后我为每个读取的记录做一些逻辑,并将其写入不同的数据库.我已经尝试过直接逐一编写,并使用nice activerecord-import gem进行批量写入.

但是,在任何一种情况下,我的ruby进程内存使用量在导出/导入的整个生命周期中都会增长很多.我认为使用find_each,我得到1000个批次,一次只能有1000个内存…但是不,我取的每个记录似乎都在永远消耗内存,直到过程结束.

有任何想法吗? ActiveRecord缓存某个我可以关闭的地方吗?

2012年1月17日更新

我想我会放弃这个.我试过了:
*确保所有内容都包含在ActiveRecord :: Base.uncached中
*添加ActiveRecord :: IdentityMap.enabled = false(我认为应该关闭当前线程的身份映射,虽然它没有明确记录,我认为默认情况下,当前Rails中的身份映射不会打开)

这些似乎都没有太大影响,记忆仍然在泄漏.

然后我添加了一个定期明确的:

> GC.start

这似乎减慢了内存泄漏的速度,但内存泄漏仍然发生(最终耗尽所有内存和轰炸).

所以我认为我放弃了,并且决定目前不可能使用AR从一个数据库中读取数百万行并将它们插入到另一个数据库中.也许在使用特定于MySQL的代码中存在内存泄漏(这是我的数据库),或者在AR中的其他地方,或者谁知道.

解决方法

我建议将每个工作单元排队到 Resque队列中.我发现ruby在迭代像这样的大型数组时会有一些怪癖.

有一个主要线程通过ID排队工作,然后有多个resque工作人员点击该队列来完成工作.

我已经在大约300k记录上使用了这种方法,因此很可能会扩展到数百万.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读