分析型数据库DuckDB基准测试
我们都知道Polars很快,分析但是型数最近DuckDB以其独特的数据库特性让我们对他有了更多的关注,本文将对二者进行基准测试,据库基准评估它们的测试速度、效率和用户友好性。分析

在评测之前我们先看看这两个框架
DuckDB(0.9.0):一个用c++编写的型数内存分析数据库。Polars(0.19.6):一个用Rust实现的据库基准超快的DataFrame库除此以外还有Pandas、Dask、测试Spark和Vaex本文主要关注DuckDB和Polars的分析基准测试,因为它们特别强调在某些环境下的型数速度性能。之所以对这两个框架进行对比是据库基准因为 Polars是我目前测试后得到最快的库,而DuckDB它可以更好的测试支持SQL,这对于我来说是分析非常好的特这个,因为我更习惯使用SQL来进行查询。型数
指标设置我使用了官方的据库基准polar基准测试存储库进行此评估。基准测试由tpc标准化查询组成。这些是专门用来评估实际的源码库、真实的工作流的性能的。在Polars官方网站上,提供了8个此类查询的详细结果。这个基准包含22个唯一的查询(q1、q2等)。这些范围从多表连接到聚合排序,所有这些都是大家认可的经过特殊构建的查询。
测试在一台配备16核AMD vCPU和32GB RAM的机器上进行。所有代码都使用Python 3.10执行。
数据大小数据是由使用scale10的存储库代码生成的,下面是每个实体的大小

我们文件读取到内存中,然后进行查询。

在q1、q9、q13和q17中,多连接、基于字符串的过滤和复杂聚合的b2b信息网组合对于polars 来说很难像duckdb那样有效地进行优化。Q21是对惟一值的计数、基于这些计数进行过滤以及随后的一系列连接的操作。
总的来说DuckDB在这两种情况下看起来更快,但这并不是全部。
因为将数据加载到内存中的过程会产生时间和内存开销。我们通过Makefile准确地度量这些成本。
复制/usr/bin/time -v make run_duckdb /usr/bin/time -v make run_polars1.2.
与polar相比,DuckDB在直接读取文件时表现出更快的性能和更低的内存使用。这表明polars 可能使用了交换内存(红色)。这些库不是为跨多台机器扩展而设计的,所以它们都进行了高效CPU核心利用率的设计。
Polars在某些特定领域表现出具有竞争力甚至更好的性能,例如直接读取文件时的磁盘IO和内存操作时的RAM IO。在磁盘IOPS较低的系统中,polar可以表现得更好。
另外:上图中的源码下载CPU百分比越高越好。值大于100%表示正在使用多核处理。
下面是我们测试的代码:
DuckDB读取Parquet直接查询
复制import duckdb conn = duckdb.connect(database=:memory:) df_count = conn.sql(""" SELECT count(*) as count_order FROM lineitem.parquet """ ).fetchdf() print(df_count)1.2.3.4.5.6.7.8.9.10.DuckDB内存查询
复制import duckdb conn = duckdb.connect(database=:memory:) conn.sql(""" CREATE TEMP TABLE IF NOT EXISTS lineitem AS SELECT * FROM read_parquet(lineitem.parquet); """ ) df_count = conn.sql(""" SELECT count(*) as count_order FROM lineitem """ ).fetchdf() print(df_count)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.Polars 读取Parquet直接查询
复制import polars as pl df = pl.scan_parquet(lineitem.parquet) df_count = df.select( pl.count().alias("count_order"), ).collect() print(df_count)1.2.3.4.5.6.Polars 内存查询
复制import polars as pl df = pl.scan_parquet(lineitem.parquet) df = df.collect().rechunk().lazy() df_count = df.select( pl.count().alias("count_order"), ).collect() print(df_count)1.2.3.4.5.6.7. 总结可以看到在Python处理引擎领域,DuckDB是一个很有前途的竞争者。他在涉及连接和复杂聚合的任务中表现非常亮眼。另外它的简单并且更干净、而且还支持SQL语句直接查询。
但是DuckDB仍处于初级阶段。可能偶尔会遇到bug或缺少功能的问题,如果你有兴趣,可以在你的研究项目中使用DuckDB替代Polars或者Pandas。
本文的测试脚本:
https://github.com/pola-rs/tpch#polars-tpch
相关文章
打造网红电脑钟表的制作教程(用创意与技术,打造属于自己的网红电脑钟表)
摘要:在如今这个数字化时代,电脑和钟表都成为了人们生活中不可或缺的物品。为何不将二者结合起来,打造一个独一无二的网红电脑钟表呢?本文将为大家详细介绍如何制作属于自己的网红电脑钟表,通过创...2025-11-04
2025-11-04- 复制SQLRETURNSQLExecDirect( SQLHSTMTStatementHandle, SQLCHAR*StatementText,2025-11-04
如何使SQL Server 数据库SQL Server 数据库
复制sp_configure‘showadvancedoptions’,1 reconfigure go sp_configur2025-11-04密码错误的原因及解决方法(电脑密码错误可能的原因和应对办法)
摘要:在日常生活中,我们使用电脑时经常会遇到密码错误的情况。密码错误可能会给我们带来很多麻烦和困扰。本文将探讨电脑密码错误的主要原因,并提供一些解决方法,帮助读者更好地应对这一问题。...2025-11-04- 复制$gobuild-oagentcmd/agent/main.go $gobuild-oproxycmd/proxy/main.go #Buildagen2025-11-04

最新评论