如何加快从pandas.DataFrame .to_sql

时间:2018-10-22 10:30:43

标签: python mysql 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)

货币我正在将数据存储在本地计算机中,但将来我必须将数据发送到mysql服务器,有什么方法可以加快插入速度 还是有什么不同的方法,以便我可以像使用批量插入一样以更快的速度存储数据。请建议

1 个答案:

答案 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