我遇到了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
我还增加了max_allowed_packet
大小以批量提交,具有更大的块大小。还是不快。
以下是DataFrame的形状:
netflow_df2.shape
(1015391, 20)
有谁知道如何让它更快?
答案 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秒。