我有一个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
我一次处理大约100K条记录。不幸的是,在20分钟时,我收到Query response returned CURSOR_NOT_FOUND
错误。
mongodb faq说使用skip
和limit
或关闭超时,使用它们所有东西大约慢2-3倍。
如何与mongoid一起关闭超时?
答案 0 :(得分:9)
MongoDB docs表示你可以传入一个超时布尔值,并且超时为false,它永远不会超时
collection.find({"type" => "a"}, {:timeout=>false})
在你的情况下:
Record.collection.find({:type=>'a'}, :timeout => false).each ...
我还建议您使用Mongo查看map-reduced。似乎是对这种集合数组操作进行了调整:http://www.mongodb.org/display/DOCS/MapReduce
答案 1 :(得分:7)
在mongoid 3中你可以使用它:
ModelName.all.no_timeout.each do |m|
"do something with model"
end
这非常方便。
答案 2 :(得分:6)
看起来,至少现在,您必须通过Mongo驱动程序进行漫长的路径和查询:
Mongoid.database[collection.name].find({ a_query }, { :timeout => false }) do |cursor|
cursor.each do |row|
do_stuff
end
end
答案 3 :(得分:1)
这是我做的解决方法。创建一个数组来保存完整的记录,并从这个数组中工作
products = []
Product.all.each do |p|
products << p
end
products.each do |p|
# Do your magic
end
将所有记录转储到数组中很可能在超时之前完成,除非您正在处理非常大量的记录。此外,如果您处理大量或太多记录,这将消耗太多内存,因此请记住。