Pandas to_sql()性能 - 为什么这么慢?

时间:2016-10-03 18:06:45

标签: python performance pandas memsql

我遇到了Pandas的性能问题,并将DataFrames写入SQL DB。为了尽可能快,我使用memSQL(在代码中就像MySQL一样,所以我不需要做任何事情)。我刚刚对我的实例进行了基准测试:

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容器。

以下是将我的DataFrame写入DB的代码:

    import MySQLdb

    import mysql.connector
    from sqlalchemy import create_engine
    from pandas.util.testing import test_parallel

    engine = create_engine('mysql+mysqlconnector://root@localhost: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秒,系统:1.69秒,总计:2分钟8秒壁挂时间:2分钟   18S

截图: memSQL shows the speed

我还增加了max_allowed_packet大小以批量提交,具有更大的块大小。还是不快。

以下是DataFrame的形状:

netflow_df2.shape
(1015391, 20)

有谁知道如何让它更快?

1 个答案:

答案 0 :(得分:1)

如果有人遇到类似的情况:

我删除了SQlalchemy并使用(已弃用的)MySQL风格用于Pandas' 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://root@localhost: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.conf中的MySQL max_allowed_packet = 1000M),我会更快。我应该能够在这里达到每秒超​​过50000行。

CPU times: user 28.7 s, sys: 797 ms, total: 29.5 s
Wall time: 38.2 s
之前的126s。现在38.2秒。