我有一张相当大的MySQL表,大约有3000万行,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慢得多,这对我来说没有多大意义。为什么会这样,有没有任何方法可以加速?即使是hack也可以。
另外,pandas与其花费的时间无关。在第二个代码片段中,如果我只返回
list(cursor)
而不是将其放入pandas DataFrame中,它需要(基本上)同样长的时间。编辑: 数据库正在与R / Python相同的机器上运行,因此吞吐量方面应该是相同的。
在R中,我使用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语言,这使得它非常慢。解决方法是使用本地C连接器MySQLdb
。
在我的特定设置中,使用anaconda运行python 3是不可能的,因为MySQLdb
仅支持python 2。然而,在名称为mysqlclient
的python 3下有一个实现MySQLdb
。
使用这个实现,读取整个表格的时间现在缩短到了约5分钟,虽然不如R快,但比以前的40多倍要快得多。
rpy
运行查询,但这不是最理想的选择。 - roganjosh