2016-10-03 78 views
2

私は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

スクリーンショット2分: memSQL shows the speed

私もコミットするmax_allowed_packetサイズを増加より大きなチャンクサイズのバルクで作成します。まだ高速ではありません。ここで

は、データフレームの形状である:

netflow_df2.shape 
(1015391, 20) 

誰もが、私はこの速く作ることができる方法を知っていますか?

私はSQLAlchemyのを取り出して、パンダto_sql()機能用(非推奨)MySQLの風味を使用:ケース誰かに

答えて

1

は似たような状況を取得します。スピードアップは120%以上です。私はこれを使用することをお勧めしませんが、それは私のために現時点では動作します。私は(MySQLのmax_allowed_packet = 1000M mysql.conf中に類似)大きなクエリを受け入れるようにmemSQLを説得する方法を見つけた場合

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) 

私も速くなります。ここでは1秒間に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_pa​​cket設定(http://docs.memsql.com/docs/memsqlcnf)もあります。 –

+0

私はこれをテストしてきましたが、他の変数を適応させる必要もあるようです。私が60 000のバルクサイズを選択した場合は、SQL構文エラーが戻ってきて、クエリが削除されます。 – wishi

関連する問題