DuckDB 分析 10GB 日志 CSV:把 pandas 30 分钟查询压到 8 秒,我只做了这三步
DuckDB 分析 10GB 日志 CSV把 pandas 30 分钟查询压到 8 秒我只做了这三步说实话我最近被一个 10GB 的 Nginx 访问日志搞得很烦。业务要做一个“最近 30 天接口访问热度”的临时分析数据导出来是 10GB 的 CSV。我用 pandas 跑了几次第一次直接 OOM第二次加了dtype和chunksize分段处理跑了 30 分钟才出结果中间还卡死两次。同事在旁边说“要不你直接写 Hive SQL 吧”问题是我就一个人本地想查个数据犯得着上集群吗后来我想起 DuckDB 这个嵌入式分析型数据库。它不需要服务器一个 Python 包就能跑还能直接读 CSV/Parquet。结果很离谱同样的查询pandas 30 分钟DuckDB 8 秒。我把过程整理成三步方便你下次也直接抄作业。问题背景为什么 pandas 在这里这么慢我的日志文件格式很常规timestamp,method,path,status,response_time,remote_ip,user_agent 2026-07-15T10:00:0008:00,GET,/api/user,200,23,1.2.3.4,Mozilla/5.0...10GB 大概 1.2 亿行。我要做的其实不复杂按path分组统计 PV按remote_ip统计 Top 20 来源 IP按status分组看 4xx/5xx 占比算response_time的 P95/P99pandas 的瓶颈主要在两点它默认会把整个 CSV 读到内存光加载就要吃 40GB 左右内存。字符串列在 pandas 里开销很大聚合时临时对象又多CPU 和内存一起爆炸。不是 pandas 不行是它定位就不是给“单节点分析 10GB 日志”设计的。DuckDB 天生 columnar、向量化、支持直接读取外部文件明显更适合这个场景。第一步CSV 转 Parquet压缩和结构一起搞定DuckDB 可以直接读 CSV但日志分析是反复查询最好先把 CSV 转成 Parquet。Parquet 是列式存储压缩率高读取时还能只读需要的列。我用了一个 Python 脚本做转换importduckdb conduckdb.connect()con.execute( COPY ( SELECT strptime(timestamp, %Y-%m-%dT%H:%M:%S%z)::timestamp AS ts, method, path, status::smallint AS status, response_time::integer AS response_time, remote_ip, user_agent FROM read_csv_auto(nginx_logs.csv) ) TO nginx_logs.parquet (FORMAT PARQUET, COMPRESSION ZSTD) )这段代码有两个关键细节用strptime把带时区的字符串转成timestamp后面按时间过滤不会出错。status和response_time显式转成 smallint/integer避免 DuckDB 把数字当成大字符串处理。转换耗时大概 1 分 40 秒10GB CSV 压成了 1.4GB 的 Parquet。不是 pandas 那种“读完再写”的过程DuckDB 是一边读 CSV 一边写 Parquet内存基本稳定在 1GB 左右。第二步用 SQL 直接查 Parquet聚合快到离谱转换完之后查询就非常爽了。DuckDB 支持read_parquet直接读取文件不需要导入表。importduckdb conduckdb.connect()# Top 20 接口 PVcon.execute( SELECT path, count(*) AS pv FROM read_parquet(nginx_logs.parquet) GROUP BY path ORDER BY pv DESC LIMIT 20 ).fetchdf()# P95/P99 响应时间con.execute( SELECT quantile_cont(response_time, 0.95) AS p95, quantile_cont(response_time, 0.99) AS p99 FROM read_parquet(nginx_logs.parquet) ).fetchdf()# Top 20 来源 IPcon.execute( SELECT remote_ip, count(*) AS cnt FROM read_parquet(nginx_logs.parquet) GROUP BY remote_ip ORDER BY cnt DESC LIMIT 20 ).fetchdf()这三个查询加起来在我这台 16GB 内存的笔记本上跑了 8.2 秒。作为对比pandas 单查询groupby那一步就跑了 12 分钟以上。第一次 OOM 之后我顺手记了下对比数据方案加载时间聚合时间峰值内存文件大小pandasread_csv groupby约 8 分钟约 22 分钟41GB10GB CSVpandaschunksize分段聚合约 5 分钟约 25 分钟12GB10GB CSVDuckDB CSV→Parquet SQL约 1 分 40 秒约 8 秒1.2GB1.4GB Parquetpandas 分段聚合虽然内存下来了但代码要写多线程合并复杂度直线上升。DuckDB 这边基本就是写 SQL省下来的时间够我喝杯咖啡。顺手加了几个时间维度的查询业务不只是看总数还想看每天 4xx/5xx 的变化趋势。用 DuckDB 也很简单con.execute( SELECT date_trunc(day, ts) AS day, status, count(*) AS cnt FROM read_parquet(nginx_logs.parquet) WHERE status 400 GROUP BY day, status ORDER BY day DESC, cnt DESC ).fetchdf()date_trunc这种时间函数不需要额外导入 datetime直接写 SQL 就行。再搭配quantile_cont算分位list/unnest展开数组基本常见的日志分析需求都能覆盖。我还顺手写了一个环比查询把最近 7 天和上一周的接口 PV 做对比找出涨幅超过 30% 的接口。DuckDB 支持 CTESQL 结构和在 PostgreSQL 里写的几乎一样迁移成本很低。临时查一次可以但如果每天都想跑一遍最好封装起来。我把上面这些固定成了analyze_logs.pyimportduckdbimportsys LOG_PATHsys.argv[1]iflen(sys.argv)1elsenginx_logs.parquetconduckdb.connect()# 限制最大内存防止小机器被拖死con.execute(SET memory_limit 4GB)con.execute(SET threads 4)print( 接口 PV Top 20 )print(con.execute(f SELECT path, count(*) AS pv FROM read_parquet({LOG_PATH}) GROUP BY path ORDER BY pv DESC LIMIT 20 ).fetchdf().to_string(indexFalse))print(\n 状态码分布 )print(con.execute(f SELECT status, count(*) AS cnt, round(count(*) * 100.0 / sum(count(*)) over (), 2) AS pct FROM read_parquet({LOG_PATH}) GROUP BY status ORDER BY status ).fetchdf().to_string(indexFalse))print(\n 响应时间分位 )print(con.execute(f SELECT round(quantile_cont(response_time, 0.50), 2) AS p50, round(quantile_cont(response_time, 0.95), 2) AS p95, round(quantile_cont(response_time, 0.99), 2) AS p99 FROM read_parquet({LOG_PATH}) ).fetchdf().to_string(indexFalse))加memory_limit和threads是为了让它在笔记本上也能稳一点。如果你的机器更强可以把线程数调大。它不会像 pandas 那样冷不丁把内存吃光然后被系统 OOM killer 干掉。踩坑记录时区字符串解析容易出错我原始日志的时区格式是08:00strptime的格式串要写%Y-%m-%dT%H:%M:%S%z。如果直接read_csv_auto后按时间过滤时区会识别成字符串结果全错。CSV 里有脏数据要处理有些行的response_time是-或者空值DuckDB 默认会报错。可以在read_csv_auto里加nullstr[, -]和columns{...}或者用try_cast容错。Parquet 文件路径含通配符如果是按天拆分的日志比如logs/2026-07-*.parquet可以直接用read_parquet(logs/*.parquet)DuckDB 会自动并行读多个文件。DuckDB 版本差异0.10 之前的read_csv_auto对类型推断比较激进建议升级。我用的是 1.0.0稳定很多。不是银弹这些情况我还是选 ClickHouse 或 pandasDuckDB 虽然香但不是所有场景都合适数据超过 100GB 或者需要持续实时写入这种规模 DuckDB 单节点会比较吃力ClickHouse、Doris、Snowflake 这类真正的分布式 OLAP 更合适。要做复杂的特征工程、数据清洗流水线pandas 的 DataFrame 操作更灵活结合 DuckDB 的fetchdf()把结果拉出来再用 pandas 处理也是不错的选择。团队协作需要权限和元数据管理DuckDB 是本地文件没有用户权限、Schema 版本管理多人协作时还是得上数据库服务。我的做法是把 DuckDB 当成“本地超大数据文件分析器”导入、聚合、出数然后结果再回到 pandas 做可视化或者业务层使用。两个工具并不冲突选对场景才是关键。DuckDB 不是来替代 ClickHouse 或 Snowflake 的它真正的定位是你本地有一个几十 GB 的数据文件想快速用 SQL 查一遍不想搭服务也不想 pandas 折磨你。如果数据量超过 100GB 或者需要实时写入那还是得看真正的 OLAP 集群。但如果你像我一样经常被“临时导出的 CSV 日志”和“pandas 跑不动”之间的鸿沟卡住那 DuckDB 真的是被低估的神器。安装也简单一行命令就能搞定pipinstallduckdbDuckDB 还有官方的命令行工具duckdb如果你不想写 Python直接在 shell 里跑 SQL 也可以。我有时候临时查数就用 CLI比起一个 Python 脚本更省事。我把上面的转换脚本和分析脚本都整理好了复制过去改个路径就能跑。如果你也有类似的日志分析场景不妨试试看。有问题欢迎在评论区交流或者告诉我你用什么方案处理过大的 CSV。

相关新闻

11.Python 面向对象三大特性详解:封装、继承、多态与多继承、魔术方法及抽象类

11.Python 面向对象三大特性详解:封装、继承、多态与多继承、魔术方法及抽象类

摘要:本文系统讲解了 Python 面向对象的三大特性——封装、继承(重点涵盖多继承与 MRO)和多态,同时介绍了常用的魔术方法、魔术属性以及如何使用 abc 模块定义抽象类,帮助开发者深入理解 Python 面向对象编程的核心机制…

2026/8/6 5:31:49 阅读更多 →
浏览器自动化Agent实战:GUI操作与网页抓取完整解决方案

浏览器自动化Agent实战:GUI操作与网页抓取完整解决方案

浏览器自动化Agent实战:GUI操作与网页抓取完整解决方案 【免费下载链接】ai-agent-book 《深入理解 AI Agent:设计原理与工程实践》(李博杰 著)开源主仓库:全书正文、编译版 PDF 与按章配套代码 项目地址: https://g…

2026/8/5 5:04:24 阅读更多 →
自托管 Umami 实现 iOS 应用分析:免重量级 SDK,数据统计更精准!

自托管 Umami 实现 iOS 应用分析:免重量级 SDK,数据统计更精准!

鲁纳奥维森耶尔巴克相关信息涉及领导力、产品与技术,包含项目、文章、演讲、关于等方面。使用自托管的 Umami 进行 iOS 应用分析2026 年 7 月 14 日发布,阅读时长 7 分钟,标签有分析、iOS、应用、开源、Fly、Cloudflare。因已自托管 Umami&am…

2026/8/6 21:03:37 阅读更多 →

最新新闻

UIScrollView-Examples实战:10分钟实现完美的委托方法(Delegate)处理

UIScrollView-Examples实战:10分钟实现完美的委托方法(Delegate)处理

UIScrollView-Examples实战:10分钟实现完美的委托方法(Delegate)处理 【免费下载链接】UIScrollView-Examples UIScrollView examples for blog post 项目地址: https://gitcode.com/gh_mirrors/ui/UIScrollView-Examples UIScrollView-Examples是一个专注于…

2026/8/6 22:59:51 阅读更多 →
Python网络小说分析系统:技术实现与优化策略

Python网络小说分析系统:技术实现与优化策略

## 1. 项目概述与核心价值网络小说作为数字阅读领域的重要分支,每年产生数以百万计的新作品。这个基于Python的分析系统,本质上是一个面向网络文学领域的垂直领域数据分析工具。我在实际开发中发现,这类系统最核心的价值在于帮助研究者或平台…

2026/8/6 22:59:51 阅读更多 →
从0到1开发掌机移植游戏:PortMaster贡献者文档深度解读

从0到1开发掌机移植游戏:PortMaster贡献者文档深度解读

从0到1开发掌机移植游戏:PortMaster贡献者文档深度解读 【免费下载链接】PortMaster A simple tool that allows you to download various game ports that are available for 351Elec/AmberElec, ArkOS, JelOS, RetroOZ, TheRA, and UnofficialOS for the RK3326 a…

2026/8/6 22:59:51 阅读更多 →
全自动焊线设备的运动控制与视觉定位技术简析

全自动焊线设备的运动控制与视觉定位技术简析

在工业自动化领域,全自动焊线设备是集精密机械、运动控制、视觉检测、温度控制于一体的典型设备。本文从技术角度简要分析其核心控制逻辑,供从事自动化集成的工程师参考。 一、运动控制系统 全自动焊线设备通常采用基于EtherCAT总线的伺服驱动方案&#…

2026/8/6 22:59:51 阅读更多 →
StPageFlip实战案例:如何用它打造专业的在线电子书阅读器

StPageFlip实战案例:如何用它打造专业的在线电子书阅读器

StPageFlip实战案例:如何用它打造专业的在线电子书阅读器 【免费下载链接】StPageFlip Simple library for creating realistic page turning effects 项目地址: https://gitcode.com/gh_mirrors/st/StPageFlip StPageFlip是一款功能强大、简单灵活的JavaScr…

2026/8/6 22:59:51 阅读更多 →
Halcon与C#联合开发工业视觉检测系统实战

Halcon与C#联合开发工业视觉检测系统实战

1. 项目概述:Halcon视觉检测与C#的强强联合 在工业自动化领域,机器视觉检测已成为质量控制的核心环节。Halcon作为业界领先的机器视觉开发库,其强大的图像处理能力和丰富的算子库,配合C#的高效开发特性,能够快速构建稳…

2026/8/6 22:58:51 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →