Mysql
 sql >> Database >  >> RDS >> Mysql

Come inserire enormi Pandas Dataframe nella tabella MySQL con l'istruzione di inserimento parallelo?

Puoi fare alcune cose per ottenerlo.

Un modo consiste nell'utilizzare un argomento aggiuntivo durante la scrittura in sql.

df.to_sql(method = 'multi')

In base a questa documentazione , il passaggio di 'multi' all'argomento del metodo consente di eseguire l'inserimento in blocco.

Un'altra soluzione è costruire una funzione di inserimento personalizzata utilizzando multiprocessing.dummy.here è il collegamento alla documentazione: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')

Il secondo metodo è stato suggerito su https://stackoverflow.com/a/42164138/5614132 .