2016-10-03 858 views
2

我遇到了Pandas的性能問題,並將DataFrame寫入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 

這不是光榮的,它只是我的本地筆記本電腦。我知道......我也在使用root用戶,但這是一個拋棄式的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行/秒。

CPU時間:用戶2分6秒,SYS:1.69 s,共:2分8秒牆時間:2分鐘 18S

截圖: memSQL shows the speed

我還增加了max_allowed_packet大小承諾散裝,大塊大小。仍然不會更快。

下面是數據框的形狀:

netflow_df2.shape 
(1015391, 20) 

有誰知道我怎麼能做出這樣快?

回答

1

萬一某人得到了類似的情況:

我刪除的SQLAlchemy和使用(不推薦)MySQL的香精,用於大熊貓to_sql()功能。加速超過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) 

如果我找出如何說服memSQL接受大量的查詢(類似於MySQL的max_allowed_packet = 1000M在mysql.conf)我會更快。我應該能夠在這裏每秒擊中超過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