问题描述: 数据表中有一个字段为 blob 字段,每条记录中 blob 字段约为几百 kB 左右。目前测试数据有一千多条数据。 使用 where 语句进行查询的结果会将 blob 字段的加载到内存里来(约 322MB),但在使用完数据后,对象所占用的内存并没有立即释放。
问题: 怎么手动进行释放对象占用的内存? 目前使用过的方法均没有效果:将对象置为 nil;使用 GC 进行收集回收。
把变量设置成 $line , 这样每次读取 $line , 都只是一个 $line 变量。
GC.start
ActiveRecord 可能 cache 你的这些查询结果。你可以 debug 到 ActiveRecord 里面去看这些 query result 是怎么缓存的。
即使你做到了 1. 确保这个变量无法被访问到 2. 调用 GC.start 启动垃圾回收,在目前 YARV 的实现中,这样也只能把对象之前占用的内存给 YARV 回收掉,而不能让整个 Ruby 进程把不需要的内存返还给操作系统。
如果"一千多条数据"可以逐条处理,看一下你所使用的 DB Driver 或 ORM 是否提供流式处理的 API . 避免一次性全都读进内存。比如 ActiveRecord 的:http://api.rubyonrails.org/classes/ActiveRecord/Batches.html#method-i-find_each
#4 楼 @5long 嗯,谢谢,目前可以降低一些内存,但是 [heap] 中还是有 100MB 左右不能释放。