sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo insertar un marco de datos enorme de pandas en una tabla MySQL con una declaración de inserción paralela?

Puedes hacer algunas cosas para lograrlo.

Una forma es usar un argumento adicional mientras se escribe en sql.

df.to_sql(method = 'multi')

Según esta documentación , pasar 'multi' al argumento del método le permite realizar una inserción masiva.

Otra solución es construir una función de inserción personalizada usando multiprocessing.dummy. Aquí está el enlace a la documentación:https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.dummy

import math
from multiprocessing.dummy import Pool as ThreadPool

...

def insert_df(df, *args, **kwargs):
    nworkers = 4 # number of workers that executes insert in parallel fashion

    chunk = math.floor(df.shape[0] / nworkers) # number of chunks
    chunks = [(chunk * i, (chunk * i) + chunk) for i in range(nworkers)]
    chunks.append((chunk * nworkers, df.shape[0]))
    pool = ThreadPool(nworkers)

    def worker(chunk):
        i, j = chunk
        df.iloc[i:j, :].to_sql(*args, **kwargs)

    pool.map(worker, chunks)
    pool.close()
    pool.join()

....

insert_df(df, "foo_bar", engine, if_exists='append')

El segundo método se sugirió en https://stackoverflow.com/a/42164138/5614132 .