wis*_*shi 7 python performance pandas singlestore
我遇到了 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
Run Code Online (Sandbox Code Playgroud)
这不是光荣的,它只是我本地的笔记本电脑。我知道......我也在使用 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)
Run Code Online (Sandbox Code Playgroud)
下面是%time函数的测量。
多线程并没有使这更快。它保持在 7000 - 8000 行/秒内。
CPU 时间:用户 2 分 6 秒,系统:1.69 秒,总计:2 分 8 秒挂墙时间:2 分 18 秒
我还增加了max_allowed_packet批量提交的大小,块大小更大。还是不快。
这是 DataFrame 的形状:
netflow_df2.shape
(1015391, 20)
Run Code Online (Sandbox Code Playgroud)
有谁知道我怎样才能让它更快?
如果有人遇到类似的情况:
我删除了 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)
Run Code Online (Sandbox Code Playgroud)
如果我找到如何说服 memSQL 接受大型查询(类似于max_allowed_packet = 1000Mmysql.conf 中的 MySQL),我会更快。我应该能够达到每秒超过 50000 行的速度。
CPU times: user 28.7 s, sys: 797 ms, total: 29.5 s
Wall time: 38.2 s
Run Code Online (Sandbox Code Playgroud)
126秒之前。现在38.2秒。