繁体   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