0

假设我在 MongoDB 中有一个大型查询(出于本练习的目的,假设它返回 1M 条记录),例如:

users = Users.where(:last_name => 'Smith')

如果我遍历这个结果,与每个成员一起工作,比如:

users.each do |user|
  # Some manipulation to "user"
  # Some calculation for "user"
  ...
  # Saving "user"
end

我经常会遇到 Mongo 游标超时(因为保留的数据库游标超过了默认的超时长度)。我知道我可以延长光标超时时间,甚至将其关闭——但这并不总是最有效的方法。因此,我解决此问题的一种方法是将代码更改为:

users = Users.where(:last_name => 'Smith')
user_array = []
users.each do |u|
    user_array << u
end

然后,我可以遍历 user_array(因为它是一个 Ruby 数组),进行操作和计算,而不用担心 MongoDB 超时。

这很好用,但必须有更好的方法——有人有建议吗?

4

2 回答 2

3

如果您的结果集太大而导致游标超时,则将其完全加载到 RAM 不是一个好主意。

一种常见的方法是批量处理记录。

  1. 获取 1000 个用户(按 _id 排序)。
  2. 处理它们。
  3. 获取另一批 1000 个用户,其中 _id 大于最后处理用户的 _id。
  4. 重复直到完成。
于 2012-06-18T21:08:46.313 回答
0

对于长时间运行的任务,请考虑使用 rails runner。

runner 在 Rails 上下文中以非交互方式运行 Ruby 代码。例如:

$ rails runner "Model.long_running_method"

有关详细信息,请参阅:

http://guides.rubyonrails.org/command_line.html

于 2012-06-18T21:11:07.777 回答