Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como acelerar a inserção de pandas.DataFrame .to_sql


O problema aqui é para cada linha que uma consulta de inserção é feita, então antes da próxima inserção de linha ela espera por ACK.

Tente executar este trecho antes de 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

Este é um patch de nhockham em to_sql insert que insere linha por linha. Aqui está o problema do github.

Se você puder renunciar ao uso do pandas.to_sql, sugiro que tente inserir em massa sql-alchemy ou apenas escreva um script para fazer uma consulta multilinha por conta própria.

Edit:Para esclarecer, estamos modificando o método _execute_insert da classe SQLTable em pandas.io.sqlEntão isso deve ser adicionado nos scripts antes de importar o módulo pandas.

A última linha é a mudança.

conn.execute(self.insert_statement(), data) foi alterado para:

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

A primeira linha inserirá linha por linha, enquanto a última linha inserirá todas as linhas em uma instrução sql.

Atualização:para versões mais recentes de pandas, precisaremos de uma pequena modificação na consulta acima.
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