Ist es find_in_batches in Rails? Es ist eine nette Methode, die eine große Datenmenge nacheinander verarbeitet, ohne alle Ergebnisse im Speicher zu speichern.
Wenn Sie der Meinung sind, dass es sich um eine Methode handelt, die Grenzwerte und Offsets gut handhabt, ist es eine Methode, die das ausgewählte Ergebnis als Stream ohne so etwas verarbeitet.
Als ich mir das SQL-Protokoll ansah, dachte ich, dass es neben mir noch andere Leute geben würde, die befürchten, dass SQL nicht wie erwartet herauskommt, also werde ich es mir notieren.
Wie man Memo nur für den Fall verwendet
yield_per.sample.py
sess = Session(engine)
for obj in sess.query(Customer).filter_by(ownd_uid = n).yield_per(10):
hogehoge(obj)
Wenn Sie es so schreiben, wird es verarbeitet, während unter der Filterbedingung viele Datensätze ausgewählt sind, während 10 Datensätze gleichzeitig ausgewählt werden, sodass alle ausgewählten Ergebnisse nacheinander verarbeitet werden, ohne im Speicher gespeichert zu werden.
Es ist das Beste.
Wenn Sie versuchen, processlist unter MySQL anzuzeigen, scheint jede vonield_per aufgerufene Verbindung eine Verbindung zu haben. Ist das so, wenn du fragst?
Die erste Schleife, die 945 Sekunden dauert, ist die oberste Schleife, aber ich frage mich, ob sie durch connect_timeout unterbrochen werden kann. (Ich habe das Gefühl, es wird ausgehen)
Wenn Sie nicht so viele Daten verwenden, können Sie diese möglicherweise nicht sehen. Wenn Sie also eine Fehlermeldung erhalten, notieren Sie sich die Verwendung.
Es dauerte 1-2 Stunden, endete aber ohne Probleme.
Wenn Sie eine lange Verbindung haben, können Sie die Liste der Showprozesse möglicherweise nicht abfragen. !!
Bitte untersuchen Sie auf jeden Fall das Verhalten der Verarbeitung auf der MySQL-Seite!
Recommended Posts