讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python中利用Pandas的read csv分块处理千万级数据?

冬敏小哥_5438

冬敏小哥_5438

发布时间:2026-10-29 06:02:23

|

446人浏览过

|

来源于php中文网

原创

chunksize应根据单行平均字节和可用内存合理设置,建议先估算均行长,再以50000起步实测;需透传dtype等参数,避免类型推断错误;全局统计须累积计算,写库需事务控制;务必显式关闭TextFileReader。

如何在python中利用pandas的read csv分块处理千万级数据?

read_csv 的 chunksize 参数到底怎么设才不崩内存

直接用 read_csv 读千万行 CSV 很容易 OOM,关键不是“能不能分块”,而是 chunksize 设多大才合理。它不是越大越好,也不是越小越稳——得看单行平均字节和可用内存。比如一行平均 200 字节,100 万行就是约 200MB;若机器只有 4GB 可用内存,chunksize 超过 15 万就可能触发频繁 GC 或直接报 MemoryError。

实操建议:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 先用 head -n 1000 file.csv | wc -c 估算单行均长,再乘以目标 chunk 行数反推内存占用
  • 首次尝试从 chunksize=50000 起步,在 notebook 里跑一两块观察 top 或 psutil.virtual_memory()
  • 避免设成 chunksize=1:IO 开销暴涨,Pandas 内部解析初始化成本被反复放大
  • 如果列含长文本或嵌套 JSON,chunksize 要进一步砍半——字符串对象在 Python 中的内存开销远高于原始字节

分块后 merge / groupby / to_sql 容易漏掉全局逻辑

逐块 pd.concat 再计算,看似稳妥,但像 groupby().agg('mean') 或 value_counts(normalize=True) 这类操作,直接在每块上算再平均会出错——因为分母不是全局总数。同样,to_sql 默认不处理主键冲突或重复写入。

常见错误现象:ValueError: Tables not defined(SQL 表未预建)、IntegrityError: UNIQUE constraint failed(重复 ID 写入)、结果统计值偏差超 10%。

立即学习“Python免费学习笔记(深入)”;

实操建议:

  • 全局统计类操作:先用第一块 .columns 和 .dtypes 定义空容器(如 dict 存各组 sum/count),每块迭代更新,最后统一除总 count
  • 写数据库:用 if_exists='append' + 显式事务控制,或先写临时表再 INSERT OR REPLACE 合并
  • 需要去重或排序的场景(如取 top-k):每块先局部 top-k,最后合并再全局 top-k,别省这一步

dtype 和 parse_dates 不传进 chunk 循环里等于白设

很多人把 dtype、parse_dates、usecols 放在第一次 read_csv 调用里,但忘了——每个 chunk 都是独立调用 read_csv,参数必须显式透传进去,否则 Pandas 会为每块重新推断类型,既慢又不准。

典型后果:object 列本该是 int64,因某块含空值被判成字符串;日期列没 parse_dates 就变成字符串,后续 .dt.month 报 AttributeError。

实操建议:

  • 把所有关键参数打包成 dict,例如 csv_kwargs = {'usecols': [...], 'dtype': {...}, 'parse_dates': [...], 'chunksize': 50000},然后 for chunk in pd.read_csv('x.csv', **csv_kwargs):
  • 对含混合类型的数值列(如 '1'、'2.5'、''),强制指定 dtype={'col': 'string'} 再手动 pd.to_numeric(..., errors='coerce'),比让 Pandas 自推更可控
  • 时间列若含时区或非标准格式(如 '2023-01-01T12:00:00+08:00'),别依赖 parse_dates,改用 date_parser 参数传自定义函数

用 iterator=True + get_chunk() 比 for 循环更灵活但更易忘关

pd.read_csv(..., chunksize=N) 返回的是 TextFileReader 对象,本质是带状态的迭代器。如果中途 break 或异常退出,没显式 .close(),底层文件句柄可能卡住,尤其在 Windows 上会导致后续无法删除或重命名该 CSV 文件。

性能影响:不用 iterator=True 也能循环,但 get_chunk() 允许动态调整每次读多少行(比如前几块快,后面遇到长文本行就自动降 chunksize),而普通 for 循环 chunksize 是死的。

实操建议:

  • 务必用 with pd.read_csv(..., chunksize=N) as reader:(虽然 Pandas 当前版本还没实现 __enter__,所以实际得手写 try/finally)
  • 更稳妥写法:
    reader = pd.read_csv('data.csv', chunksize=50000)
    try:
        for chunk in reader:
            process(chunk)
    finally:
        reader.close()
  • 调试时想看某一块,用 reader.get_chunk(1000) 提前取样,比等完整循环快得多
分块读取本身不难,难的是每一块都得当“独立数据集”来验逻辑——类型、缺失、边界值、聚合维度,全得在 chunk 粒度上重新校准。没人会在意你用了 chunksize=100000 还是 87321,但所有人会立刻发现统计结果差了 3%。

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1831

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4864

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1769

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

29057

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3467

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3487

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1223

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn