如何高效读取超大CSV文件(千万行级)而不爆内存

云墨大大_4643

云墨大大_4643

2026-09-25

537人浏览

原创

如何高效读取超大CSV文件(千万行级)而不爆内存

本文介绍三种主流方案:pandas分块读取、dask延迟计算和原生csv模块流式处理,涵盖代码示例、性能权衡与关键调优技巧,助你稳定处理1000万+行csv数据。

本文介绍三种主流方案:pandas分块读取、dask延迟计算和原生csv模块流式处理,涵盖代码示例、性能权衡与关键调优技巧,助你稳定处理1000万+行csv数据。

处理超大CSV文件(如1000万行以上)时,直接使用 pd.read_csv() 加载全部数据极易触发MemoryError。根本解决思路是避免一次性加载全量数据到内存,转而采用流式读取、延迟计算或按需解析策略。以下是经过实践验证的三种高效方案:

✅ 方案一:pandas chunksize —— 简单可控,适合聚合/过滤类任务

chunksize 参数将CSV按行分批加载为DataFrame迭代器,每批仅占用对应内存,适合统计汇总、条件筛选、批量写入等场景。

import pandas as pd

filename = "large_data.csv"
chunksize = 50_000  # 推荐 10k–100k 行/块,过大仍可能OOM;过小则I/O开销上升

# 示例:计算某数值列的全局总和
total_sales = 0
for chunk in pd.read_csv(filename, chunksize=chunksize, usecols=["sales"]):  # 显式指定列,大幅减内存
    total_sales += chunk["sales"].sum()
print(f"总销售额: {total_sales:,}")

关键优化点:

  • 使用 usecols 仅读取必需列(可减少30%–70%内存);
  • 设置 dtype(如 {"id": "uint32", "price": "float32"})避免默认object或float64浪费;
  • 对字符串列启用 dtype={"category"} 或 low_memory=False 防止类型推断错误;
  • 处理完每块后显式 del chunk 并调用 gc.collect()(Python 3.12+ 可省略)。

✅ 方案二:Dask DataFrame —— 类pandas语法,支持并行与分布式

Dask将大数据集切分为多个分区(partitions),所有操作均延迟执行(lazy evaluation),.compute() 时才真正计算,天然支持多核加速。

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
import dask.dataframe as dd

# 自动按64MB块分割(推荐值),也可设 nrows=1e6 指定行数
ddf = dd.read_csv(
    "large_data.csv",
    blocksize="64MB",
    dtype={"user_id": "uint32", "amount": "float32"},
    assume_missing=True  # 处理空值更鲁棒
)

# 链式操作不立即执行
result = ddf[ddf["amount"] > 100]["amount"].mean().compute()  # 触发实际计算
print(f"高消费用户平均金额: {result:.2f}")

适用场景:
✔️ 需要复杂链式操作(filter → groupby → agg → join);
✔️ 单机多核CPU充足,追求比pandas chunk更快的吞吐;
⚠️ 注意:首次 .compute() 仍会占用峰值内存,但远低于全量加载。

✅ 方案三:原生 csv 模块 + 生成器 —— 极致内存控制,适合逐行逻辑

当只需提取特定字段、做简单转换或写入新文件时,csv.reader 或 csv.DictReader 内存占用最低(每行仅数百字节)。

import csv

def process_large_csv(filename):
    with open(filename, "r", newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)  # 或 csv.reader(f)
        for i, row in enumerate(reader, 1):
            # 示例:提取ID和状态,跳过无效行
            if not row.get("id") or row.get("status") != "active":
                continue
            yield int(row["id"]), row["name"]

# 流式处理,内存恒定 ~1KB
for user_id, name in process_large_csv("large_data.csv"):
    if user_id % 100000 == 0:
        print(f"已处理 {user_id} 条活跃用户")

优势:

  • 内存占用与文件大小无关,仅取决于单行长度;
  • 可无缝集成 concurrent.futures 实现多线程解析(注意GIL限制);
  • 配合 yield 实现管道化(pipeline)处理,如:read → validate → transform → write。

? 终极建议与避坑指南

  • 优先尝试 pandas + chunksize:学习成本低、生态完善,90%场景已足够;
  • 避免 pandas.read_csv(..., iterator=True):已被弃用,统一用 chunksize;
  • 警惕 dask 的“假并行”:单机下若I/O瓶颈明显,多线程反而拖慢;建议先用 dd.read_csv(..., sample_nrows=10000) 探查schema;
  • 预处理优于运行时处理:对超大文件,考虑用 awk/sed/csvkit 提前清洗(如删空行、抽样建索引);
  • 终极手段:数据库导入:sqlite3(轻量)、duckdb(分析快)或 postgresql COPY,适合反复查询场景。

选择方案的核心依据是:你的计算模式(单次聚合?多次交互?实时流?)和硬件约束(内存 vs CPU vs 磁盘IO)。没有银弹,但理解每种机制的内存模型,就能精准控压、稳定交付。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

csv csv文件

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.07.20

1571

4

python能做什么
python能做什么

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

2023.07.25

3764

7

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

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

2023.07.31

1589

3

python教程
python教程

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

2023.08.03

21657

23

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

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

2023.08.04

2667

5

python eval
python eval

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

2023.08.04

2727

5

scratch和python区别
scratch和python区别

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

2023.08.11

1103

5

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

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

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2103

5

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习