python - 如何加快从 pandas.DataFrame .to_sql 的插入

标签 python mysql pandas

你好我目前正在尝试将数据从四个 pandas 数据帧写入我本地机器上的 mysql,我的机器需要 32 秒来插入 20,000 条记录(每个表 5000 条)代码-

表格 - 1)职位 2)post_stats 3)post_languages 4) post_tags

engine = create_engine("mysql+mysqldb://root:dbase@123@localhost/testDb")

startTime=time.time()

dfstat.to_sql('post_stats', con=engine, if_exists='append', index=False)
for i in range(0, dfp.shape[0]):
ss = str(dfp.iloc[i][0])
sss = 'Select id from post_stats where post_id =\"%s\"' % (ss)
#print(sss)
rss = engine.execute(sss)
x = rss.fetchone()
dfp['stats_id'][i] = x[0]
dfp.to_sql('posts', con=engine, if_exists='append', index=False)
dfl.to_sql('post_languages', con=engine, if_exists='append', index=False)
dftagv.to_sql('post_tags', con=engine, if_exists='append', index=False)


endTime=time.time()
diff=endTime-startTime 
print(diff)

Currenlty 我将数据存储在我的本地机器上,但将来我必须将数据发送到 mysql 服务器,有什么方法可以加快插入速度 或者是否有任何不同的方法,以便我可以像使用批量插入一样以更快的速度存储数据。请建议

最佳答案

这里的问题是对每一行进行插入查询,然后在插入下一行之前等待 ACK。

尝试在 import pandas as pd 之前运行此代码段

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print("Using monkey-patched _execute_insert")
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

SQLTable._execute_insert = _execute_insert

这是 nhockham 的补丁在逐行插入的 to_sql insert 上。 Here's the github issue.

如果您可以放弃使用 pandas.to_sql,我建议您尝试使用 sql-alchemy 批量插入或自己编写脚本来进行多行查询。

编辑: 为了澄清,我们正在修改 pandas.io.sql 类 SQLTable 的 _execute_insert 方法 所以这必须在导入 pandas 模块之前添加到脚本中。

最后一行是变化。

conn.execute(self.insert_statement(), data) 已更改为:

conn.execute(self.insert_statement().values(data))

第一行将逐行插入,而最后一行将插入一个 sql 语句中的所有行。

更新:对于较新版本的 pandas,我们需要对上述查询稍作修改。

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print("Using monkey-patched _execute_insert")
    data = [dict(zip(keys, row)) for row in data_iter]
    conn.execute(self.table.insert().values(data))

SQLTable._execute_insert = _execute_insert

关于python - 如何加快从 pandas.DataFrame .to_sql 的插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52927213/

相关文章:

PHP MySQL 计数结果和 IF 即所有结果

mysql - 我将如何设置 if account_status = 1 那么我可以登录否则无法登录?

python - 在将字符串强制转换为 unicode 时如何让 python 2.x 发出警告?

python - 在jupyter笔记本中折叠单元格

mysql - 您的密码不符合当前政策要求

python - 如何为重复行生成序号

python-3.x - 如何使用 Pandas groupby() 将列的逗号分隔项的字符串聚合到列表中?

python - Pandas 融化了 n 列和顺序控制(计数器)

python - 进程在 urllib2 套接字重置时挂起

python - 如何使用django只渲染部分带有数据的html