2016-10-03 7 views
2

팬더에 성능 문제가 발생하여 DataFrames를 SQL DB에 쓰고 있습니다. 최대한 빨리하려면 memSQL을 사용합니다 (코드에서 MySQL과 비슷하므로 아무 것도 할 필요가 없습니다). 지금 인스턴스를 벤치마킹했습니다 :팬더 to_sql() 성능 - 왜 그렇게 느린가요?

docker run --rm -it --link=memsql:memsql memsql/quickstart simple-benchmark 
Creating database simple_benchmark 
Warming up workload 
Launching 10 workers 
Workload will take approximately 30 seconds. 
Stopping workload 
42985000 rows inserted using 10 threads 
1432833.3 rows per second 

그건 영광이 아니며 단지 내 로컬 랩톱입니다. 나도 알아. 나는 루트 사용자도 사용하고 있지만, Docker 컨테이너이다.

다음
import MySQLdb 

    import mysql.connector 
    from sqlalchemy import create_engine 
    from pandas.util.testing import test_parallel 

    engine = create_engine('mysql+mysqlconnector://[email protected]:3306/netflow_test', echo=False) 
    # max_allowed_packet = 1000M in mysql.conf 
    # no effect 

    # @test_parallel(num_threads=8) 
    def commit_flows(netflow_df2): 
     % time netflow_df2.to_sql(name='netflow_ids', con=engine, if_exists = 'append', index=False, chunksize=500) 
    commit_flows(netflow_df2) 

함수의 %time 측정입니다 : 여기

는 DB에 내 DataFrame를 기록하는 코드입니다.

Multi-threading이 속도가 빨라지지 않습니다. 그것은 7000 - 8000 rows/s 내에 남아 있습니다.

CPU 시간 : 사용자 2 분의 기가, SYS : 1.69의 총 : 벽 시간 8 초 2 분 : 는 18 세

스크린 샷 2 분 : memSQL shows the speed

가 나는 또한 max_allowed_packet 크기를 증가 커밋 대량으로, 큰 청크 크기. 아직 빠르지 않다. 여기

는 DataFrame의 모양입니다 :

netflow_df2.shape 
(1015391, 20) 

사람이 내가이 더 빨리 만들 수있는 방법을 알고 있나요?

내가 SQLAlchemy의 제거와 팬더 'to_sql() 기능에 대한 (사용되지 않음) MySQL의 풍미를 사용 : 사례 누군가에

답변

1

는 비슷한 상황을 가져옵니다. 속도 향상은 120 % 이상입니다. 이 방법을 사용하지 않는 것이 좋습니다. 그러나 지금은 저에게 좋습니다.

import MySQLdb 

import mysql.connector 
from sqlalchemy import create_engine 
from pandas.util.testing import test_parallel 

engine = MySQLdb.connect("127.0.0.1","root","","netflow_test") 

# engine = create_engine('mysql+mysqlconnector://[email protected]:3306/netflow_test', echo=False) 

# @test_parallel(num_threads=8) 
def commit_flows(netflow_df2): 
    % time netflow_df2.to_sql(name='netflow_ids', flavor='mysql', con=engine, if_exists = 'append', index=False, chunksize=50000) 
commit_flows(netflow_df2) 

내가 (MySQL의의 max_allowed_packet = 1000M mysql.conf에서 유사) 큰 쿼리 내가 더 빨리 될 것입니다 동의 memSQL을 설득하는 방법을 알아 경우

. 여기서 초당 50000 개 이상의 행을 칠 수 있어야합니다.

CPU times: user 28.7 s, sys: 797 ms, total: 29.5 s 
Wall time: 38.2 s 

126s. 38.2 초.

+1

MemSQL에는 max_allowed_packet 설정 (http://docs.memsql.com/docs/memsqlcnf)도 있습니다. –

+0

나는 이것을 테스트했지만 다른 변수를 적용해야 할 것으로 보인다. 60 000의 대량 크기를 선택한 경우 SQL 구문 오류가 다시 발생하고 쿼리가 잘립니다. – wishi

관련 문제