sql >> Databáze >  >> RDS >> Mysql

Jak vložit obrovský datový rámec Pandas do tabulky MySQL pomocí příkazu Parallel Insert?

Můžete udělat pár věcí, abyste toho dosáhli.

Jedním ze způsobů je použití dalšího argumentu při zápisu do sql.

df.to_sql(method = 'multi')

Podle této dokumentace , předání 'multi' argumentu metody vám umožní hromadné vkládání.

Dalším řešením je vytvořit vlastní funkci vkládání pomocí multiprocessing.dummy.zde je odkaz na dokumentaci: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')

Druhá metoda byla navržena na https://stackoverflow.com/a/42164138/5614132 .




  1. Stanovení a identifikace cílů řádků v prováděcích plánech

  2. Co způsobuje chybu Více není rozpoznáno... při spuštění Postgresql 11 na počítači se systémem Windows?

  3. Nelze se připojit k '/var/run/mysqld/mysqld.sock'

  4. Získávání chyby Neplatná kombinace porovnávání (utf8mb4_unicode_ci,IMPLICIT) a (utf8mb4_general_ci,IMPLICIT) pro operaci '='