메모리에로드 할 때 상당히 큰 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 개 정도였습니다.
나는 판다 데이터 프레임으로 변환을 분리 할 것이지만 이것은 실제로 흥미 롭습니다. –
좋은 지적입니다. 판다 전환이 아닙니다. 단순히 행 목록을 가져 오는 데는 약 40 분이 걸립니다. – mrip
네트워크가 관련되어 있습니까? 데이터베이스가 켜져있는 것과 동일한 시스템에서 스크립트를 실행하고 있습니까? – alecxe