Ich habe eine Abfrage, die Tausende von Objekten lädt und ich möchte sie mit find_in_batches
:
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?
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!
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.
Der langsamere manuelle Weg, dies zu tun, ist etwas wie folgt:
%Vor%Tags und Links ruby-on-rails activerecord