Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment accélérer l'insertion de pandas.DataFrame .to_sql

Le problème ici est que pour chaque ligne, une requête d'insertion est effectuée, puis avant l'insertion de la ligne suivante, elle attend ACK.

Essayez d'exécuter cet extrait avant d'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

Ceci est un correctif de nhockham sur to_sql insert qui insère ligne par ligne. Voici le problème de github.

Si vous pouvez renoncer à utiliser pandas.to_sql, je vous suggère d'essayer l'insertion en masse sql-alchemy ou simplement d'écrire un script pour créer vous-même une requête multiligne.

Edit :Pour clarifier, nous modifions la méthode _execute_insert de la classe SQLTable dans pandas.io.sql. Cela doit donc être ajouté dans les scripts avant l'importation du module pandas.

La dernière ligne est le changement.

conn.execute(self.insert_statement(), data) a été remplacé par :

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

La première ligne insérera ligne par ligne tandis que la dernière ligne insérera toutes les lignes dans une instruction sql.

Mise à jour :pour les versions plus récentes de pandas, nous aurons besoin d'une légère modification de la requête ci-dessus.

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