【发布时间】:2017-02-11 18:18:11
【问题描述】:
我在使用 Pandas 并将 DataFrame 写入 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 行/秒内。
CPU时间:用户2分钟6秒,系统:1.69秒,总计:2分钟8秒挂壁时间:2分钟 18秒
我还增加了max_allowed_packet 的大小以批量提交,块大小更大。仍然没有更快。
这是DataFrame的形状:
netflow_df2.shape
(1015391, 20)
有谁知道我怎样才能使这更快?
【问题讨论】:
标签: python performance pandas singlestore