用Python处理超大CSV文件:内存不够用?这招帮你搞定

liftword1个月前 (03-20)技术文章21

嗨,小伙伴们,大家好啊!今天咱们来看一个特别实用的话题:如何处理那些大到爆炸的 CSV 文件。Boss摔给你一个任务:10GB 的用户购物记录 CSV 文件,让你统计每个用户的总消费金额。但当你兴冲冲地用 pandas 打开文件时...电脑内存不够用了!这可咋整?

为啥会遇到这个问题?

传统的做法(比如用 pandas)会一次性把整个文件加载到内存中。这就像你想把一头大象塞进小面包车 —— 那当然塞不进去啊!

解决方案:分批次读取处理!

就像搬家时把大象切成小块运输一样,我们可以把大文件分成小块来处理。Python 提供了一个特别好用的工具:csv 模块。

先来看看具体怎么做:

import csv
from collections import defaultdict

def process_large_csv(filename):
    # 用字典存储每个用户的消费总额
    user_totals = defaultdict(float)
    
    # 打开文件,开始逐行处理
    with open(filename, 'r') as file:
        # 创建 CSV 读取器
        csv_reader = csv.DictReader(file)
        
        # 逐行处理数据
        for row in csv_reader:
            user_id = row['user_id']  # 假设CSV中有user_id列
            amount = float(row['amount'])  # 假设CSV中有amount列
            user_totals[user_id] += amount
            
    return user_totals

# 使用示例
filename = 'huge_shopping_records.csv'
results = process_large_csv(filename)

# 打印前5个用户的消费总额
for user_id, total in list(results.items())[:5]:
    print(f"用户 {user_id} 总消费: yen{total:.2f}")

想处理得更快?来个进度条!

from tqdm import tqdm  # 需要先 pip install tqdm

def process_large_csv_with_progress(filename):
    user_totals = defaultdict(float)
    
    # 先数一下总行数
    total_rows = sum(1 for _ in open(filename)) - 1  # 减去标题行
    
    with open(filename, 'r') as file:
        csv_reader = csv.DictReader(file)
        # 添加进度条,让处理过程可视化
        for row in tqdm(csv_reader, total=total_rows, desc="处理进度"):
            user_id = row['user_id']
            amount = float(row['amount'])
            user_totals[user_id] += amount
            
    return user_totals

为什么这种方法这么棒

  1. 超级省内存:一次只读一行数据,就像用小勺子一口一口吃大象
  2. 速度够快:虽然不如 pandas 一次性加载快,但胜在稳定可靠
  3. 简单易用:代码简单,容易理解和修改

实用技巧

  1. 处理脏数据
def safe_float_convert(value):
    try:
        return float(value)
    except (ValueError, TypeError):
        return 0.0

# 在处理数据时使用
amount = safe_float_convert(row['amount'])
  1. 定期保存中间结果
# 每处理10万行保存一次结果
if csv_reader.line_num % 100000 == 0:
    with open('intermediate_results.txt', 'w') as f:
        for user_id, total in user_totals.items():
            f.write(f"{user_id},{total}\n")

总结

这个技巧特别适合处理:

  • 用户行为日志
  • 交易记录数据
  • 传感器采集数据
  • 网站访问日志 ...等等各种大文件!

如果数据量特别大,考虑用多进程处理,记得处理异常情况哦,这就像是把大象分成小块处理的智慧 —— 不求一次性搞定,但求稳扎稳打,分批处理才是王道。有问题尽管在评论区问我,一起学习进步!

相关文章

分享一个文件整理使用Python小脚本(删除相同文件减小内存占用)

写在前面:脚本作用:在目标文件夹中筛选出大小相同的文件,并打印在屏幕上,这样可以快速找出相同文件,释放硬盘内存。前期部署:安装python并做好配置环境变量(基础)先上代码:import osfrom...

python如何进行内存管理

关于首先python进行内存管理就不得不提到Python解释器在何种情况下会释放变量的内存。Python引用了内存计数这一简单的计数来控制。当一个变量的引用计数为0的时候,就会被解释器回收。当然在交互...

一文读懂 Python 的内存管理

Python 是一种高级编程语言,以其简单性和可读性而闻名。它的主要功能之一是自动内存管理,这对开发人员来说至关重要,因为它抽象了手动内存分配和释放的复杂性。本文旨在深入了解 Python 的内存管...

一文掌握Python内存管理

Python中的内存是由Python内存管理器(Python memory manager)来管理的,它涉及到一个包含所有Python对象和数据结构的私有堆(heap)。Python内存管理器有不同的...

Python 的内存管理与垃圾回收

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者| 慕课网精英讲师 朱广蔚1. 内存管理概述1.1 手动内存管理在计算机发展的早期,编程语言提供了手动内存管理的机制,例如...

喂!你这个python的内存是不是爆了?喏,拿这个去测试一下看看

你是否曾经为python程序的内存占用问题头疼不已?是否觉得内存泄漏、对象占用过多内存等问题难以排查?别急,今天我要介绍一个神器——pympler,让你轻松搞定python内存分析!01什么是pymp...