我遇到了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
我還增加了max_allowed_packet
大小承諾散裝,大塊大小。仍然不會更快。
下面是數據框的形狀:
netflow_df2.shape
(1015391, 20)
有誰知道我怎麼能做出這樣快?
MemSQL還具有max_allowed_packet設置 - http://docs.memsql.com/docs/memsqlcnf。 –
我一直在測試這個,但似乎我還需要修改一些其他變量。如果我選擇了60 000的批量大小,我會返回SQL語法錯誤,並且查詢被切斷。 – wishi