私はPandasのパフォーマンス問題を抱えており、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
を、そして、それはちょうど私の地元のラップトップだ:私はちょうど今、私のインスタンスをベンチマーク。私は知っている...私はまた、ルートユーザーを使用していますが、それはスローアウェイドッカーのコンテナです。ここで
は、DBへの私のデータフレームを書き込むコードです:
以下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行/ s以内に留まります。ウォール時間8秒2分:
CPU時間:ユーザーの2分の6S、SYS:1.69秒、合計 18S
私もコミットする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