簡體   English   中英

與R相比,將mysql表加載到python中需要很長時間

[英]Loading mysql table into python takes a very long time compared to R

我有一個相當大的mysql表,大約30M行,6列,加載到內存時大約2GB。

我使用python和R.在R中,我可以將表加載到內存中,大約需要90秒。 但在python中需要40分鍾。

我用sqlalchemy和普通的pymysql都試過了。 代碼很簡單,例如sqlalchemy:

db_engine = sqlalchemy.create_engine("mysql+pymysql://user:pass@host/database")
cnx = db_engine.connect()
table = pd.read_sql('select * from my_table',cnx)
cnx.close()

沒有sqlalchemy:

cnx = mysql.connector.connect(**db_details)
cursor = cnx.cursor()
cursor.execute('select * from my_table')
table = pd.DataFrame(data=list(cursor),columns = cursor.column_names)
cnx.close()

無論哪種方式,它都比R慢得多,這對我來說沒有多大意義。 為什么會這樣,有什么方法可以加速它? 即使是黑客也會這樣做。

要補充一點,大熊貓花了這么長時間才與它有任何關系。 在第二個代碼片段中,如果我只返回list(cursor)而不是將其放入pandas DataFrame中,它(基本上)也需要一樣長。

編輯時:數據庫與R / Python在同一台機器上運行,因此所有內容在吞吐量方面都應該相同。

在RI am使用DBI,我使用的R代碼(基本上)是這樣的:

require(DBI)
cnx <- dbConnect(dbDriver("MySQL"),dbname="database",username="user",password="pass",host="host")
table <- dbGetQuery(cnx,"select * from my_table")

********已解決(大部分)********

感謝有用的評論,特別是來自@roganjosh,看來問題是默認的mysql連接器是用python而不是C編寫的,這使得它非常慢。 解決方案是使用MySQLdb ,它是一個本機C連接器。

在我的特定設置中,使用anaconda運行python 3,這是不可能的,因為MySQLdb僅在python 2中受支持。但是,有一個名為mysqlclientMySQLdb for python 3的實現。

使用這種實現方式,現在讀取整個表格的時間大約為5分鍾,而不是像R一樣快,但遠遠低於之前的40左右。

感謝有用的評論,特別是來自@roganjosh,看來問題是默認的mysql連接器是用python而不是C編寫的,這使得它非常慢。 解決方案是使用MySQLdb ,它是一個本機C連接器。

在我的特定設置中,使用anaconda運行python 3,這是不可能的,因為MySQLdb僅在python 2中受支持。但是,有一個名為mysqlclientMySQLdb for python 3的實現。

使用這種實現方式,現在讀取整個表格的時間大約為5分鍾,而不是像R一樣快,但遠遠低於之前的40左右。

我仍然願意接受能讓它變得更快的建議,但我的猜測是,它會變得更好。

還有一個純C / C ++ ultramysql MySQL驅動程序 ,可以與umysqldb適配器一起使用。 項目不活躍,但可以用於一次性的事情 - 我不會在生產中使用它們。

由於pymysql是純Python驅動程序,您也可以嘗試在PyPy上運行它。

暫無
暫無

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

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