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

Pandas to_sql() performance - why is it so slow?

我 运行 遇到 Pandas 的性能问题,并将数据帧写入 SQL 数据库。为了尽可能快,我使用 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 写入数据库的代码:

    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 rows/s 之间。

CPU times: user 2min 6s, sys: 1.69 s, total: 2min 8s Wall time: 2min 18s

截图:

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

这是 DataFrame 的形状:

netflow_df2.shape
(1015391, 20)

有谁知道我怎样才能让它更快?

如果有人遇到类似情况:

我删除了 SQLalchemy,并为 Pandas' to_sql() 函数使用了(已弃用的)MySQL 风格。加速比超过 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 中 mysql.conf 中的 max_allowed_packet = 1000M),我会更快。我在这里应该可以达到每秒 50000 多行。

CPU times: user 28.7 s, sys: 797 ms, total: 29.5 s
Wall time: 38.2 s

126 秒之前。现在38.2秒。