python - 在 MySQL 数据库中保存 pandas 数据帧的最快方法是什么
问题描述
我正在用 python 编写代码来生成和更新基于另一个数据库中的另一个 mysql 表的 mysql 表。
我的代码是这样的:
对于 date_range 中的日期:
在 db1 中查询两个日期之间的数量
在 pandas 中做一些工作 => df
在 db2 中删除具有 df 中 id 的行
用 df.to_sql 保存 df
操作 1-2 耗时不到 2s,而操作 3-4 最多耗时 10s。第 4 步比第 3 步多花 4 倍。如何改进我的代码以使编写过程更高效
我已经为第 3 步和第 4 步分块了 df。我已经添加method=multi
了.to_sql
(这根本不起作用)。我想知道我们是否可以做得更好;
with db.begin() as con:
for chunked in chunks(df.id.tolist(), 1000):
_ = con.execute(""" DELETE FROM table where id
in {} """.format(to_tuple(chunked)))
for chunked in chunks(df.id.tolist(), 100000):
df.query("id in @chunked").to_sql('table', con, index=False,
if_exists='append')
感谢您的帮助
解决方案
我发现df.to_sql
速度很慢。我解决这个问题的一种方法是将数据帧输出到 csv 文件中,df.to_csv
并使用 BCP in 将 csv 中的数据插入表中,然后在插入完成后删除 csv 文件。您可以使用 subprocess 在 python 脚本中运行 BCP。
推荐阅读
- javascript - 我可以在 Python 中创建类似 JavaScript 的对象吗
- ruby-on-rails - PG::UndefinedTable:错误:关系“条目”不存在
- .net - 在 UWP 中以短时间间隔运行简短的后台任务以应对特殊情况的报警场景
- algorithm - 如何使用带递归的方案将数字插入已排序的数字,合并后的数字仍然排序?((插入1245 3)-> 12345)
- java - 使用java中的正则表达式剥离或概括SQL字符串中的所有函数调用参数
- performance - 在 Julia 中使用 FFTW 时,我可以链接到本地编译的 FFTW 版本吗?
- ios - 主详细信息页面无淡入淡出效果 Xamarin.iOS
- firebase - Firebase 云函数增加队列号
- javascript - 为什么配置文件是用 commonJS 编写的
- flutter - 如何在构建小部件中使用导航器进行重定向