0

0

如何高效分割并处理超大CSV文件以实现分块排序

心靈之曲

心靈之曲

发布时间:2026-02-09 11:55:05

|

181人浏览过

|

来源于php中文网

原创

如何高效分割并处理超大CSV文件以实现分块排序

本文介绍使用python的fileinput模块逐行读取超大csv文件,避免内存溢出,并结合数据分块策略(如按年份、国家或字段范围)实现灵活筛选与排序。

在处理GB级CSV文件时,一次性加载全部数据到内存(如用pandas.read_csv()或csv.reader配合list())极易导致内存耗尽或程序崩溃。此时,流式分块处理(streaming + chunking) 是更稳健的选择。核心思路是:不“分割文件”为物理子文件,而是逻辑分块——即在逐行读取过程中,依据业务规则(如年份区间、国家分组、数值范围等)将记录动态归类到不同容器中,再分别排序。

✅ 推荐方案:fileinput + 字典分块 + 懒排序

fileinput 模块专为大型文本文件设计,支持内存友好的逐行迭代,且自动处理编码、换行符等细节。以下是一个完整示例,将数据按「年份区间」分为4个逻辑块(如1950–1974、1975–1999、2000–2014、2015–2023),并支持用户输入查询条件后对指定块排序:

触站AI
触站AI

专业的中文版AI绘画生成平台

下载
import fileinput
from collections import defaultdict
import re

# 定义4个年份区间(可按需调整)
RANGES = [
    (1950, 1974, "mid_20th"),
    (1975, 1999, "late_20th"),
    (2000, 2014, "early_21st"),
    (2015, 2023, "recent")
]

# 初始化分块存储:{block_name: [(country, abv, year, expectancy), ...]}
blocks = {name: [] for _, _, name in RANGES}

# 流式读取CSV(跳过表头)
with fileinput.input('life_expectancy.csv', encoding='utf-8') as f:
    next(f, None)  # 跳过首行(表头)
    for line_num, line in enumerate(f, start=2):
        line = line.strip()
        if not line:  # 跳过空行
            continue
        try:
            parts = line.split(',')
            # 安全提取字段(防索引越界/类型错误)
            if len(parts) < 4:
                print(f"警告:第{line_num}行字段不足4个,已跳过")
                continue
            country = parts[0].strip('"\' ')   # 去除引号和空格
            abv = parts[1].strip('"\' ')
            year = int(parts[2])
            expectancy = float(parts[3])

            # 按年份归入对应块
            assigned = False
            for start, end, block_name in RANGES:
                if start <= year <= end:
                    blocks[block_name].append((country, abv, year, expectancy))
                    assigned = True
                    break
            if not assigned:
                print(f"提示:第{line_num}行年份 {year} 不在预设区间内,已忽略")

        except (ValueError, IndexError) as e:
            print(f"解析错误(第{line_num}行):{e}")

# 用户交互:选择块并排序
print("\n可用数据块:", list(blocks.keys()))
target_block = input("请输入要排序的块名(如 'recent'): ").strip()
if target_block not in blocks:
    print("无效块名!")
else:
    # 示例:按预期寿命降序排序
    sorted_data = sorted(blocks[target_block], key=lambda x: x[3], reverse=True)
    print(f"\n【{target_block} 块 - 按预期寿命排序前5条】")
    for i, (c, a, y, e) in enumerate(sorted_data[:5], 1):
        print(f"{i}. {c} ({a}), {y}: {e:.2f} 年")

⚠️ 关键注意事项

  • 永远校验字段数量与类型:split(',') 可能因CSV中含逗号(如 "United States, Inc.")而失效。生产环境强烈建议改用 csv.DictReader 配合 fileinput 或 pandas.read_csv(chunksize=N)。
  • 内存权衡:上述代码将每个块全部载入内存后再排序。若单块仍过大,可进一步改为「分块排序+外部归并」(如用heapq.merge),或借助数据库(SQLite临时表)。
  • 编码与BOM:确保encoding='utf-8-sig'以自动去除UTF-8 BOM头。
  • 性能优化:对高频查询场景,可将分块结果持久化为Parquet或SQLite,后续直接索引查询。

✅ 总结

真正的“分割”不是物理切分文件,而是基于业务维度的逻辑分流。fileinput 提供了轻量、可靠的流式入口,配合字典分块与sorted()函数,即可在有限内存下完成超大CSV的灵活分治与排序。对于更复杂需求(多维聚合、模糊匹配),建议逐步过渡到Dask或Polars等分布式/高性能库。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

381

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

241

2023.10.07

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

73

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

3

2026.01.31

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

365

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2089

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

354

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.09.05

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

98

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号