팬더에 성능 문제가 발생하여 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
측정입니다 : 여기
Multi-threading이 속도가 빨라지지 않습니다. 그것은 7000 - 8000 rows/s 내에 남아 있습니다.
CPU 시간 : 사용자 2 분의 기가, SYS : 1.69의 총 : 벽 시간 8 초 2 분 : 는 18 세
가 나는 또한 max_allowed_packet
크기를 증가 커밋 대량으로, 큰 청크 크기. 아직 빠르지 않다. 여기
netflow_df2.shape
(1015391, 20)
사람이 내가이 더 빨리 만들 수있는 방법을 알고 있나요?
내가 SQLAlchemy의 제거와 팬더 'to_sql()
기능에 대한 (사용되지 않음) MySQL의 풍미를 사용 : 사례 누군가에
MemSQL에는 max_allowed_packet 설정 (http://docs.memsql.com/docs/memsqlcnf)도 있습니다. –
나는 이것을 테스트했지만 다른 변수를 적용해야 할 것으로 보인다. 60 000의 대량 크기를 선택한 경우 SQL 구문 오류가 다시 발생하고 쿼리가 잘립니다. – wishi