您好,我目前正在尝试将四个熊猫数据帧中的数据写入本地计算机上的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)
货币我正在将数据存储在本地计算机中,但将来我必须将数据发送到mysql服务器,有什么方法可以加快插入速度 还是有什么不同的方法,以便我可以像使用批量插入一样以更快的速度存储数据。请建议
答案 0 :(得分:0)
这里的问题是对每一行进行插入查询,然后在下一行插入之前等待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插入的补丁,它逐行插入。 Here's the github issue.
如果您可以放弃使用pandas.to_sql,建议您尝试sql-alchemy批量插入,或者只编写脚本以自行进行多行查询。
编辑: 为了澄清起见,我们正在pandas.io.sql中修改SQLTable类的_execute_insert方法 因此,必须在导入熊猫模块之前将其添加到脚本中。
最后一行是更改。
conn.execute(self.insert_statement(), data)
已更改为:
conn.execute(self.insert_statement().values(data))
第一行将逐行插入,而最后一行将在一个sql语句中插入所有行。
更新:对于较新版本的熊猫,我们需要对上述查询进行一些修改。
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