我遇到了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