我正在使用ActiveRecord批量迁移一张表的数据到另一个数据库中的不同表中,大约有400万行。
我使用find_each按批次获取记录。然后对每个获取的记录进行一些逻辑操作,并将其写入到另一个数据库中。我尝试过直接逐个写入以及使用很好的activerecord-import gem进行批量写入。
但是,在任何情况下,我的ruby进程内存使用量在整个导出/导入过程中都会大幅增长。我认为使用find_each,我正在获取1000个批次,每次只应该有1000个批次在内存中...但是,似乎每个我获取的记录都会消耗内存,直到进程结束。
有什么想法吗?ActiveRecord是否在缓存某些东西,我可以关闭它?
更新于2012年1月17日
我想我要放弃了。我已经尝试过:
- 确保所有内容都包装在
ActiveRecord::Base.uncached do
里 - 添加
ActiveRecord::IdentityMap.enabled = false
(我认为应该关闭当前线程的标识映射,尽管它没有明确说明,并且我认为标识映射在当前Rails中默认情况下未启用)
这两者似乎都没有太大的影响,内存仍在泄漏。
然后我添加了一个定期显式执行:
GC.start
这似乎减缓了内存泄漏的速度,但内存泄漏仍在发生(最终耗尽所有内存并崩溃)。
所以我想我要放弃了,并决定目前无法使用AR从一个数据库读取数百万行并将其插入到另一个数据库中。也许MySQL特定代码(我的数据库)或其他地方的AR中存在内存泄漏,或者别的什么问题。