项目中某行代码 ( map 迭代 ) 执行时占用 CPU 资源到 90% 多。 代码如下:
users = (uids.map {|uid| MasterFriend.find(uid)}).to_a
uids 是一个大小为 6000 多的数组,里面存放的 user 表的 id 字段(mongoid 自带的_id 字段)
这个迭代查询总耗时在 5s 以上,mongoid 默认_id 字段是加了索引的。MasterFriend 表不到 10000 条记录。
请教如何优化?
发现了新的问题,如上获得的 users 数组里面存放了很多个 document 对象(约为 5000)。然后我发现这种情况下,我去遍历这个数组,对每个 document 对象调用其 encode 方法(就是把输出为 json 格式),这个时候耗时更加严重。
def encode
{
id: self.id.to_s,
images: images.first,
gender: gender
}
end
第一种遍历(严格意义上算不上遍历):
users.map :&encode
第二种遍历:
arr=[]
users.each do |u|
arr << u.encode
end
发现第二种遍历方式比第一种执行速度要慢 1 倍。执行这两段代码的时候 cpu 都飙到 90% 多了。而且假如我直接把 users 数组赋值给另外一个数组,直接内存泄露了。
我是一边在 rails console 中执行,一边开着另外一个窗口用 top 命令实时查看的。
请教一下,ruby 里面的迭代就这么耗时吗?数组存放太多数据是否也不合适?如何避免内存泄露的问题?