Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So beschleunigen Sie das Einfügen von pandas.DataFrame .to_sql

Das Problem hier ist, dass für jede Zeile eine Einfügeabfrage gestellt wird und dann vor dem Einfügen der nächsten Zeile auf ACK gewartet wird.

Versuchen Sie, dieses Snippet auszuführen, bevor Sie import pandas as pd

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print("Using monkey-patched _execute_insert")
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

SQLTable._execute_insert = _execute_insert

Dies ist ein Patch von nhockham on to_sql insert, das Zeile für Zeile einfügt. Hier ist das Github-Problem.

Wenn Sie auf die Verwendung von pandas.to_sql verzichten können, schlage ich vor, dass Sie es mit sql-alchemy Bulk Insert versuchen oder einfach ein Skript schreiben, um selbst eine mehrzeilige Abfrage zu erstellen.

Bearbeiten:Zur Verdeutlichung ändern wir die Methode _execute_insert der Klasse SQLTable in pandas.io.sql. Daher muss dies in den Skripten hinzugefügt werden, bevor das Pandas-Modul importiert wird.

Die letzte Zeile ist die Änderung.

conn.execute(self.insert_statement(), data) wurde geändert in :

conn.execute(self.insert_statement().values(data))

Die erste Zeile fügt Zeile für Zeile ein, während die letzte Zeile alle Zeilen in eine SQL-Anweisung einfügt.

Update:Für neuere Versionen von Pandas benötigen wir eine leichte Modifikation der obigen Abfrage.

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print("Using monkey-patched _execute_insert")
    data = [dict(zip(keys, row)) for row in data_iter]
    conn.execute(self.table.insert().values(data))

SQLTable._execute_insert = _execute_insert