我正在做一个项目,我必须编写一个包含数百万行和大约 25 列的数据框,其中大部分是数字类型。我正在使用Pandas DataFrame to SQL Function将数据帧转储到 Mysql 表中。我发现这个函数创建了一个可以一次插入多行的 Insert 语句。这是一个很好的方法,但是 MySQL 对使用这种方法可以构建的查询长度有限制。
有没有一种方法可以在同一个表中并行插入,以便我可以加快进程?
我正在做一个项目,我必须编写一个包含数百万行和大约 25 列的数据框,其中大部分是数字类型。我正在使用Pandas DataFrame to SQL Function将数据帧转储到 Mysql 表中。我发现这个函数创建了一个可以一次插入多行的 Insert 语句。这是一个很好的方法,但是 MySQL 对使用这种方法可以构建的查询长度有限制。
有没有一种方法可以在同一个表中并行插入,以便我可以加快进程?
你可以做一些事情来实现这一点。
一种方法是在写入 sql 时使用附加参数。
df.to_sql(method = 'multi')
根据此文档,将“multi”传递给方法参数允许您批量插入。
另一种解决方案是使用 multiprocessing.dummy 构建自定义插入函数。这是文档的链接: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')
第二种方法是在https://stackoverflow.com/a/42164138/5614132建议的。