Frage

Ich habe eine Harke Aufgabe, die eine Reihe von Datensätzen verarbeitet und speichert sie in eine andere Sammlung:

batch = [] 

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

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

Ich bin die Verarbeitung über 100K Datensätze auf einmal. Leider nur 20 Minuten, ich habe einen Query response returned CURSOR_NOT_FOUND Fehler.

Die mongodb FAQ sagt Timeouts skip und limit oder ausschalten zu verwenden, so dass sie die ganze Sache war etwa ~ 2-3 mal langsamer werden.

Wie kann ich Timeouts in Verbindung mit mongoid ausschalten?

War es hilfreich?

Lösung

Die MongoDB docs sagen Sie in einem Timeout boolean passieren kann, und es Timeout falsch ist, wird es nie Timeout

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

In Ihrem Fall:

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

ich Sie auch schauen Sie in der Karte reduzierten empfehlen mit Mongo. Es scheint diese Art der Sammlung Array Manipulation gemacht Tailer: http://www.mongodb.org/display / docs / MapReduce

Andere Tipps

In mongoid 3 können Sie diese verwenden:

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

Welche ziemlich praktisch ist.

Es scheint, denn jetzt zumindest, müssen Sie den langen Weg und Abfrage über den Mongo Treiber gehen:

Mongoid.database[collection.name].find({ a_query }, { :timeout => false }) do |cursor| 
  cursor.each do |row| 
    do_stuff 
  end 
end

Hier ist die Abhilfe, die ich tat. Erstellen Sie ein Array die vollständigen Datensätze gespeichert halten können, und die Arbeit aus dieser Reihe wie dieser

products = []

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

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

Alle Datensätze in das Array Dumping wird höchstwahrscheinlich Ziel innerhalb vor dem Timeout, es sei denn, Sie arbeiten an extrem große Anzahl von Datensätzen. Auch das ist zu viel Speicher für den Fall konsumieren wird Sie mit großen oder zu viele Datensätze als auch zu tun haben, so zu halten in diesem Sinn.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top