与R相比,将mysql表加载到python中需要很长时间

时间:2017-02-08 16:37:49

标签: python mysql r

我有一个相当大的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左右。

2 个答案:

答案 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上运行它。