你好我目前正在尝试将数据从四个 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/