2016-10-03 860 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