news 2026/4/30 10:02:37

Pandas 太慢?DuckDB 上手指南:用 SQL 在 Python 中极速查询亿级 CSV 数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pandas 太慢?DuckDB 上手指南:用 SQL 在 Python 中极速查询亿级 CSV 数据

🐢 前言:Pandas 的“阿喀琉斯之踵”

Pandas 是 Python 数据分析的神器,但它有两个致命弱点:

  1. 内存占用高:Pandas 通常需要 5-10 倍于文件大小的内存。处理 1GB 的数据可能需要 10GB 内存。
  2. 单线程执行:默认情况下,Pandas 只能利用一个 CPU 核心,无法榨干现代多核 CPU 的性能。

当数据量达到“亿级”时,我们需要换一种思路:列式存储 + 向量化执行。这就是 DuckDB 的强项。


🦆 一、 什么是 DuckDB?为什么它这么快?

DuckDB 是一个进程内(In-Process)的 SQL OLAP 数据库。

  • 进程内:像 SQLite 一样,无需安装服务器,pip install即可使用。
  • OLAP:专为分析(聚合、排序、连接)优化,采用列式存储
  • 向量化引擎:一次处理一批数据(Vector),而不是一行行处理,极大利用 CPU 缓存。

Pandas vs DuckDB 处理逻辑对比 (Mermaid):

DuckDB (列式/多线程)

流式读取需要的列

CPU Core 1

CPU Core 2

CPU Core 3

CSV 文件

向量化引擎

并行聚合

计算结果

Pandas (行式/单线程)

解析所有列

CPU Core 1

读取 CSV 到内存

内存膨胀 (OOM风险)

计算结果


🛠️ 二、 环境准备

DuckDB 的安装极其简单,没有复杂的配置。

pipinstallduckdb pandas

💻 三、 实战:挑战亿级 CSV 查询

假设我们有一个巨大的销售数据文件sales_data.csv(1 亿行,约 10GB),包含字段:date,product_id,amount

我们的任务是:计算每个月的销售总额。

1. Pandas 的做法 (反面教材)

如果你尝试直接读取,普通笔记本大概率会崩溃:

importpandasaspd# ⚠️ 警告:内存小于 32G 可能直接死机# df = pd.read_csv("sales_data.csv")# result = df.groupby('date')['amount'].sum()
2. DuckDB 的做法 (降维打击)

DuckDB 允许你直接对 CSV 文件写 SQL,它会自动进行流式处理,不会把整个文件读入内存。

importduckdbimporttime start_time=time.time()# 直接将 CSV 文件当作一张表来查询# read_csv_auto 会自动推断类型query=""" SELECT date, SUM(amount) as total_sales FROM read_csv_auto('sales_data.csv') GROUP BY date ORDER BY total_sales DESC """# execute() 执行查询,df() 将结果转换为 Pandas DataFrameresult_df=duckdb.sql(query).df()end_time=time.time()print(f"耗时:{end_time-start_time:.2f}秒")print(result_df.head())

实测结果对比(模拟数据):

  • Pandas: 内存溢出(OOM)或耗时 300秒+。
  • DuckDB: 内存占用 < 1GB,耗时5-10秒

🔗 四、 进阶玩法:DuckDB 与 Pandas 的无缝融合

DuckDB 最强大的地方在于它不排斥 Pandas,而是与其共生。
你可以把 DuckDB 当作 Pandas 的**“外挂加速引擎”**。

场景:查询已有的 DataFrame

如果你已经有一个 DataFrame,但想用 SQL 做复杂的 Join 或 Window Function(窗口函数),DuckDB 可以直接查询 Python 变量!

importpandasaspdimportduckdb# 创建两个普通的 DataFrameusers=pd.DataFrame({'id':[1,2,3],'name':['Alice','Bob','Charlie']})orders=pd.DataFrame({'id':[101,102,103],'user_id':[1,1,2],'amount':[100,200,50]})# 使用 DuckDB 直接关联这两个 DataFrame# 注意:直接在 SQL 中写变量名 'users' 和 'orders'result=duckdb.sql(""" SELECT u.name, SUM(o.amount) as total_spent FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.name """).df()print(result)

为什么这很牛?
这也是 DuckDB 的黑科技——Zero-Copy (零拷贝)。它通过 Apache Arrow 协议直接读取 Pandas 的内存数据,而不需要复制一份,速度极快。


📂 五、 终极建议:放弃 CSV,拥抱 Parquet

虽然 DuckDB 读 CSV 很快,但 CSV 本身是低效的(文本格式,体积大)。
如果你真的要处理大数据,请将数据转为Parquet格式。

DuckDB 处理 Parquet 简直是光速

# 1. 把 CSV 转 Parquet (只需做一次)duckdb.sql("COPY (SELECT * FROM 'sales_data.csv') TO 'sales_data.parquet' (FORMAT 'PARQUET')")# 2. 查询 Parquet (比 CSV 再快 10 倍)duckdb.sql("SELECT SUM(amount) FROM 'sales_data.parquet'")

🎯 总结

DuckDB 不是要完全取代 Pandas,它们是互补关系:

  • 数据清洗、小规模数据探索:继续用Pandas,API 灵活。
  • 大规模数据聚合、SQL 查询、多表 Join:果断切换DuckDB

在 Python 数据分析的工具箱里,DuckDB 是当下最值得掌握的“屠龙刀”。

Next Step:
找一个你电脑上最大的 CSV 文件(或者去 Kaggle 下载一个 GB 级的数据集),复制上面的代码跑一下,亲自体验一下风扇不再狂转的快感!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 16:14:37

深度测评10个AI论文写作软件,MBA论文写作必备!

深度测评10个AI论文写作软件&#xff0c;MBA论文写作必备&#xff01; AI 工具助力论文写作&#xff0c;高效降重成新趋势 在当今学术研究日益数字化的背景下&#xff0c;MBA 学生和研究人员正面临越来越高的论文写作压力。无论是开题报告、文献综述&#xff0c;还是实证分析与…

作者头像 李华
网站建设 2026/4/29 19:19:12

探索DigSILENT PowerFactory中的风储联合系统:蓄电池特性建模与实践

DIgSILENT PowerFactory 风储联合&#xff0c;蓄电池进行特性建模&#xff0c;风储并网无穷大系统&#xff0c;蓄电池特性如下&#xff0c;风电机组采用双闭环DFIG&#xff0c;可以根据风速变化验证蓄电池和风机的联合作用。 有SOC特性在电力系统研究领域&#xff0c;风储联合系…

作者头像 李华
网站建设 2026/4/26 10:46:19

掘金社区热帖:十分钟入门Sonic数字人生成

掘金社区热帖&#xff1a;十分钟入门Sonic数字人生成 在短视频内容爆炸的今天&#xff0c;你是否也遇到过这样的困境&#xff1a;精心写好的脚本&#xff0c;却因为出镜尴尬、配音不搭、剪辑耗时而迟迟无法发布&#xff1f;更别提那些需要多语种切换、24小时轮播的AI客服、虚拟…

作者头像 李华
网站建设 2026/4/22 0:00:56

VoxCPM-1.5-TTS-WEB-UI支持RESTful API接入第三方应用

VoxCPM-1.5-TTS-WEB-UI 支持 RESTful API 接入第三方应用 在智能语音日益渗透日常生活的今天&#xff0c;从车载导航的温柔提示到电商平台的自动通知播报&#xff0c;高质量语音合成已不再是“锦上添花”&#xff0c;而是用户体验的核心环节。然而&#xff0c;许多团队在落地 T…

作者头像 李华
网站建设 2026/4/29 15:10:13

Mathtype公式转换出错?我们的文本输入兼容性强

Mathtype公式转换出错&#xff1f;我们的文本输入兼容性强 在科研写作、教学课件制作或学术报告准备中&#xff0c;越来越多用户希望将包含复杂数学公式的文档转为语音进行校对或分享。但现实往往令人失望&#xff1a;复制一段Word里的公式到TTS工具里&#xff0c;结果不是“E等…

作者头像 李华
网站建设 2026/4/29 17:12:13

【Linux命令大全】002.文件传输之ftp命令(实操篇)

【Linux命令大全】002.文件传输之ftp命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统文件传输命令的全面汇总与深度优化&#xff0c;结合图标、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#xff01;) 文…

作者头像 李华