2017-02-08 1 views
7

메모리에로드 할 때 상당히 큰 mysql 테이블, 약 30M 행, 6 열, 약 2GB가있다.파이썬에 mysql 테이블을 로딩하는 것이 R에 비해 매우 오랜 시간이 걸린다.

저는 파이썬과 R에서 모두 작동합니다. R에서는 테이블을 메모리에로드 할 수 있으며 약 90 초가 걸립니다. 그러나 파이썬에서는 40 분이 걸립니다.

저는 sqlalchemy와 일반 pymysql을 모두 사용해 보았습니다. 코드는 SQLAlchemy의, 예를 들면, 간단 :

db_engine = sqlalchemy.create_engine("mysql+pymysql://user:[email protected]/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보다 훨씬 느립니다입니다. 왜 이것이, 그리고 속도를 높이는 방법이 있습니까? 해킹조차도 할 것입니다.

덧붙이 자면, pandas는 오랜 시간이 걸리는 것과 관련이 없습니다. 두 번째 코드에서 pandas DataFrame에 넣는 대신 list(cursor)을 반환하면 (기본적으로) 오래 걸립니다.

편집시 : DB는 R/Python과 동일한 컴퓨터에서 실행되므로 처리량면에서 모든 것이 동일해야합니다.

는 RI에서

는 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 Connector가 C가 아닌 Python으로 작성되어 매우 느린 것으로 보입니다. 해결책은 기본 C 커넥터 인 MySQLdb을 사용하는 것입니다. MySQLdb는 그러나 파이썬 2에서 지원되기 때문에 아나콘다와 비단뱀 3을 실행 내 특정 설정에서

, 그 이름 mysqlclient에서 파이썬 3 MySQLdb의 구현이 불가능했다.

이 구현을 사용하면 시간이 이제는 전체 테이블을 읽는 데 약 5 분이 걸리지 만 R만큼 빠르지는 않지만 이전에 40 개 정도였습니다.

+0

나는 판다 데이터 프레임으로 변환을 분리 할 것이지만 이것은 실제로 흥미 롭습니다. –

+0

좋은 지적입니다. 판다 전환이 아닙니다. 단순히 행 목록을 가져 오는 데는 약 40 분이 걸립니다. – mrip

+0

네트워크가 관련되어 있습니까? 데이터베이스가 켜져있는 것과 동일한 시스템에서 스크립트를 실행하고 있습니까? – alecxe

답변

1

@roganjosh와 같은 유용한 의견 덕분에 기본 MySQL 커넥터가 C가 아닌 Python으로 작성되어 매우 느린 것으로 보입니다. 해결책은 기본 C 커넥터 인 MySQLdb을 사용하는 것입니다. MySQLdb는 그러나 파이썬 2에서 지원되기 때문에 아나콘다와 비단뱀 3을 실행 내 특정 설정에서

, 그 이름 mysqlclient에서 파이썬 3 MySQLdb의 구현이 불가능했다.

이 구현을 사용하면 시간이 이제는 전체 테이블을 읽는 데 약 5 분이 걸리지 만 R만큼 빠르지는 않지만 이전에 40 개 정도였습니다.

나는 그것을 더 빨리 만들 제안에 대해서는 공개적으로 생각하고 있지만 이것은 얻을 수있는만큼 좋은 결과라고 생각합니다.

0

umysqldb adapter과 함께 사용할 수있는 순수 C/C++ ultramysql MySQL driver도 있습니다. 프로젝트는 활동적이지 않지만 한 번만 사용할 수 있습니다. 프로덕션에서는 사용하지 않을 것입니다.

pymysql은 순수 Python 드라이버이므로 PyPy에서 실행 해보십시오.

관련 문제