(Fake-) Cursors für ActiveRecord (Rails 2.3)

Roland Moriz, 24. Februar 2009 14:18

Ryan Daigle stellt in seinem Blog ein neues ActiveRecord-Feature von Edge-Rails vor, dass noch in das 2.3 Release wandern soll:

Standardmäßig geben von ActiveRecord abgeleitete Modelle bei find() alle Ergebnisse zurück, können aber mit einer Limit-Option eingeschränkt werden. In beiden Fällen werden jedoch die Ergebnisse sofort abgerufen und im Arbeitsspeicher vorgehalten.

Das kann bei einer größeren Anzahl von Datensätzen durchaus den Speicherverbrauch signifikant erhöhen.
Üblicherweise stellen SQL-Datenbanken dafür eine Cursor-Implementierung bereit, die ein schrittweises Verarbeiten der Ergebnis-Datensätze erlaubt.

Rails’ ActiveRecord stellt ab Rails 2.3.x dafür nun zwei neue Methoden bereit:

ActiveRecord::Base.each()

Article.each { |a| ... }
# => iteriert über alle Article in 1000er Blöcken (Standard)
 
Article.each(:conditions => { :published => true }, :batch_size => 100 ) { |a| ... }
# => iteriert über alle veröffentlichten Artikel in Blöcken zu hundert.

ActiveRecord::Base.find_in_batches()

Article.find_in_batches { |articles| articles.each { |a| ... } }
# => articles ist hier ein Array mit bis zu 1000 Artikeln (Standard) 
 
Article.find_in_batches(batch_size => 100 ) { |articles| articles.each { |a| ... } }
# => articles hat in diesem Beispiel jeweils maximal 100 Artikel

ActiveRecord nutzt hierfür aber nicht die von Datenbanken bereitgestellten Cursor-Funktionen sondern baut diese mit “limit” Anfragen nach.

Link zur Commit-Meldung auf Github

Bookmark and Share

Schlagworte: , , , , , ,

Autor: Roland Moriz, http://www.moriz.de/

Roland Moriz ist Geschäftsführer eines auf Ruby on Rails spezialisierten Softwarehauses aus München und auch als freiberuflicher Berater und Entwickler verfügbar. Er entwickelt seit 2006 Anwendungen mit Ruby on Rails, seit 1997 mit Perl und PHP. Zu den Projekten gehörten zum Beispiel Amazon.de (Marketplace), Yahoo!/FIFA (Fussball WM 2006) oder Allianz (Allianz 24, heute AllSecur.de).

Artikel bewerten:

1 Sterne2 Sterne3 Sterne4 Sterne5 Sterne (1 Bewertung(en), durchschnittlich: 5.00 (max. 5)
Loading ... Loading ...

Comments are closed.