簡體   English   中英

如何加快從 pandas.DataFrame .to_sql 插入

[英]How to speed up insertion from pandas.DataFrame .to_sql

您好,我目前正在嘗試將數據從四個 Pandas 數據幀寫入本地機器上的 mysql,我的機器插入 20,000 條記錄(每個表 5000 條)需要 32 秒時間

表格 - 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 服務器,有什么方法可以加快插入速度,或者有什么不同的方法可以像使用批量那樣以更快的速度存儲數據插入。 請建議

這里的問題是對每一行進行插入查詢,然后在下一行插入之前等待 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 上逐行插入的補丁。 這是github問題。

如果您可以放棄使用 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 語句中插入所有行。

更新:對於較新版本的熊貓,我們需要對上述查詢稍作修改。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM