我有一个相当大的mysql表,大约30M行,6列,加载到内存时大约2gb。
我使用python和R.在R中,我可以将表加载到内存中,大约需要90秒。但是在python中需要40分钟。
我用sqlalchemy和普通的pymysql尝试过它。代码很简单,例如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()
没有sqlalchemy:
list(cursor)
无论哪种方式,它都比R慢得多,这对我来说没有多大意义。为什么会这样,有什么方法可以加速它?即使是黑客也会这样做。
要添加,大熊猫与它花了这么长时间没有任何关系。在第二个代码段中,如果我只是返回require(DBI)
cnx <- dbConnect(dbDriver("MySQL"),dbname="database",username="user",password="pass",host="host")
table <- dbGetQuery(cnx,"select * from my_table")
而不是将其放入pandas DataFrame中,那么(基本上)只需要很长时间。
编辑时: DB与R / Python在同一台机器上运行,因此在吞吐量方面一切都应该是相同的。
在R中我使用的是DBI,我使用的R代码(基本上)是这样的:
MySQLdb
********已解决(大部分)********
感谢有用的评论,特别是来自@roganjosh,看来问题是默认的mysql连接器是用python而不是C编写的,这使得它非常慢。解决方案是使用MySQLdb
,这是一个本机C连接器。
在我的特定设置中,使用anaconda运行python 3,这是不可能的,因为MySQLdb
仅在python 2中受支持。但是,在名称下有一个mysqlclient
for python 3的实现#!/usr/bin/env python
import boto3
#True - Do nothing False - screw it all up
debugMode = False
#Declare
#Instance Status
#Hard Code InstanceIDs to script
if debugMode == False:
def lambda_handler(event, context):
client = boto3.client('ec2')
response = client.start_instances(InstanceIds=['i-someid',],
DryRun=False)
print ('[SPACE]:')
#Attach Instances to ELB once started.
#Hardcode Instance
def lamdba_hander(event, context):
client = boto3.client('elb')
response = client.register_instances_with_load_balancer(LoadBalancerName='someelb', Instances=[{'InstanceID': 'i-someid'},])
print('[SPACE]:')
。
使用这个实现,现在时间缩短到大约5分钟来读取整个表格,不如R快,但远远低于之前的40左右。
答案 0 :(得分:1)
感谢有用的评论,特别是来自@roganjosh,看来问题是默认的mysql连接器是用python而不是C编写的,这使得它非常慢。解决方案是使用MySQLdb
,这是一个本机C连接器。
在我的特定设置中,使用anaconda运行python 3,这是不可能的,因为MySQLdb
仅在python 2中受支持。但是,对于python 3,有一个mysqlclient
的实现名称pakyow help server
。
使用这个实现,现在时间缩短到大约5分钟来读取整个表格,不如R快,但远远低于之前的40左右。
我仍然愿意接受能让它变得更快的建议,但我的猜测是,这样做会很好。
答案 1 :(得分:0)
还有一个纯C / C ++ ultramysql
MySQL driver可以与umysqldb
adapter一起使用。这些项目不活跃,但可以用于一次性的事情 - 我不会在生产中使用它们。
由于pymysql
是纯Python驱动程序,因此您也可以尝试在PyPy
上运行它。