ActiveRecord: Alternative zu find_in_batches?

9

Ich habe eine Abfrage, die Tausende von Objekten lädt und ich möchte sie mit find_in_batches :

zähmen

Car.includes(:member).where(:engine => "123").find_in_batches(batch_size: 500) ...

Laut den Dokumenten kann ich keine benutzerdefinierte Sortierreihenfolge haben: Ссылка

Ich benötige jedoch eine benutzerdefinierte Sortierreihenfolge von created_at DESC . Gibt es eine andere Methode, diese Abfrage in Chunks wie in find_in_batches auszuführen, so dass nicht so viele Objekte auf dem Heap auf einmal leben?

    
Edmund 28.05.2015, 14:58
quelle

3 Antworten

1

Hm Ich habe über eine Lösung dafür nachgedacht (ich bin die Person, die die Frage gestellt hat). Es macht Sinn, dass find_in_batches Ihnen keine benutzerdefinierte Reihenfolge zuordnet, da wir sagen, dass Sie nach created_at DESC sortieren und eine Stapelgröße von 500 angeben. Die erste Schleife geht von 1-500, die zweite von 501-1000 usw. Was passiert, wenn jemand vor der zweiten Schleife einen neuen Datensatz in die Tabelle einfügt? Das würde an die Spitze der Abfrageergebnisse gesetzt werden und Ihre Ergebnisse würden 1 nach links verschoben werden und Ihre 2. Schleife würde eine Wiederholung haben.

Sie könnten jedoch argumentieren, dass created_at ASC sicher wäre, aber es ist nicht garantiert, wenn Ihre App einen created_at-Wert angibt.

UPDATE:

Ich habe ein Juwel für dieses Problem geschrieben: Ссылка

Seit der Verwendung hat der durchschnittliche Speicher meiner Anwendung HALVED. Ich empfehle jedem, der ähnliche Probleme hat, es zu überprüfen! Und trage dazu bei, wenn du willst!

    
Edmund 31.05.2015, 21:01
quelle
0

Können Sie sich vorstellen, wie find_in_batches mit der Sortierung bei 1M Zeilen oder mehr funktioniert? Es sortiert alle Zeilen in jedem Stapel.

Also, ich denke, es wird besser sein, die Anzahl der Sortieraufrufe zu verringern. Bei einer Stapelgröße von beispielsweise 500 können Sie nur IDs (einschließlich Sortierung) für N * 500 Zeilen laden und danach nur Stapel von Objekten mit diesen IDs laden. Also, so sollte man die Abfragen mit der Sortierung nach DB in N Male verringern.

    
ethyl.bradtke 28.05.2015 15:29
quelle
0

Der langsamere manuelle Weg, dies zu tun, ist etwas wie folgt:

%Vor%     
creativereason 28.05.2015 15:31
quelle

Tags und Links