5

我有一个 rake 任务,它处理一组记录并将其保存在另一个集合中:

batch = [] 

Record.where(:type => 'a').each do |r| 
  batch <<  make_score(r)

  if batch.size %100 == 0 
    Score.collection.insert(batch) 
    batch = [] 
  end 
end 

我一次处理大约 10 万条记录。不幸的是,在 20 分钟时,我得到了一个Query response returned CURSOR_NOT_FOUND错误。

mongodb faq说使用skiplimit或关闭超时,使用它们的所有事情都慢了大约 2-3 倍。

如何与 mongoid 一起关闭超时?

4

4 回答 4

9

MongoDB文档说你可以传入一个超时布尔值,它超时是假的,它永远不会超时

collection.find({"type" => "a"}, {:timeout=>false})

在你的情况下:

Record.collection.find({:type=>'a'}, :timeout => false).each ...

我还建议您研究使用 Mongo 减少地图。似乎对这种集合数组操作进行了调整:http ://www.mongodb.org/display/DOCS/MapReduce

于 2010-10-25T21:53:58.523 回答
8

在 mongoid 3 中你可以使用这个:

ModelName.all.no_timeout.each do |m|
   "do something with model"
end

这很方便。

于 2013-11-14T20:30:42.237 回答
6

至少现在看来,您必须走很长的路并通过 Mongo 驱动程序进行查询:

Mongoid.database[collection.name].find({ a_query }, { :timeout => false }) do |cursor| 
  cursor.each do |row| 
    do_stuff 
  end 
end
于 2011-01-27T16:30:26.220 回答
1

这是我所做的解决方法。创建一个数组来保存完整的记录,并像这样从该数组中工作

products = []

Product.all.each do |p|
products << p
end

products.each do |p|
# Do your magic
end

除非您正在处理大量记录,否则将所有记录转储到数组中很可能会在超时之前完成。此外,如果您同时处理大量或过多的记录,这将消耗过多的内存,因此请记住这一点。

于 2011-08-10T09:38:39.617 回答