pandas memory error 跳坑记录

本文介绍了解决使用pandas从CSV文件读取数据时遇到MemoryError的方法。问题出现在尝试读取小于200M的CSV文件时,通过将Python环境升级到64位并采用Anaconda安装方式得以解决。
部署运行你感兴趣的模型镜像

问题描述

使用pandas处理数据想必从事数据处理相关的童鞋没有不知道的,从csv文件用一个pd.read_csv 读入,之后随你怎么玩。最近在做数据预处理工作时,遇到了一个头疼事儿,程序每每执行到 pd.read_csv时,总是报memory error,本机8g内存,csv只有200m不到,怎么着也不应该啊!!最后各种翻stackoverflow,终于找到症结所在:

  • 请把python换成x64

没错就这么简单!

附送

用过pandas的应该都知道,在win上装pandas,想顺顺利利不折腾简直就是不可能的事儿,各种依赖搞到头大,又加上国内这恶心死人不偿命的网络,所以把python换成X64可能还真没那么容易,稍安勿躁,神器来了:

  • 请用 Anaconda,选一个X64的,直接下载安装就好,图形化,安装完自带一个python X64版本+全套数据分析包,当然其中就有pandas,而且还自带一个ipython及其他工具,不流氓,甚至强烈推荐第一次安装python就直接用这个。

The end

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

# 代码概述 当处理大量 Excel 文件时,即使优化了资源管理,仍可能出现 `MemoryError`,原因在于 **`pandas` 将所有数据加载至内存**。本次优化目标是彻底解决内存溢出问题,采用 **逐批次写入 + 零内存累积** 策略,确保最大内存占用始终可控。 --- # 代码解析 ```python import pandas as pd import os from datetime import datetime # 记录开始时间 t_0 = datetime.now() # 定义路径 input_dir = 'D:/Share/数据/消金报表/存量/' output_file = os.path.join(input_dir, '消金存量合并清单.xlsx') # 获取目标文件 files = [f for f in os.listdir(input_dir) if f.startswith('存量综拓') and f.endswith('.xlsx')] # 确保输出目录存在 os.makedirs(os.path.dirname(output_file), exist_ok=True) # 创建 ExcelWriter 对象(使用 openpyxl 引擎) with pd.ExcelWriter(output_file, engine='openpyxl', mode='w') as writer: sheet_written = False # 控制是否已写入表头 for file in files: file_path = os.path.join(input_dir, file) # 从文件名提取日期(例:存量综拓_20251104.xlsx → 2025-11-04) try: date_str = file[-13:-5] # 提取 YYYYMMDD formatted_date = f"{date_str[:4]}-{date_str[4:6]}-{date_str[6:8]}" except: formatted_date = "未知日期" # 使用 pd.ExcelFile 读取每一个 sheet with pd.ExcelFile(file_path) as xls: for sheet_name in xls.sheet_names: # 读取当前 sheet df = pd.read_excel(xls, sheet_name=sheet_name) # 添加“名单下发时间” df['名单下发时间'] = formatted_date # 删除“券内容”列(如果存在) if '券内容' in df.columns: df = df.drop(columns=['券内容']) # 第一次写入带表头,后续追加不带表头 df.to_excel( writer, sheet_name='合并数据', startrow=0 if not sheet_written else writer.sheets['合并数据'].max_row, header=not sheet_written, index=False ) sheet_written = True print(f"合并完成,耗时:{datetime.now() - t_0}") ``` --- ### ✅ 终极优化:**避免任何内存累积** | 优化点 | 说明 | |--------|------| | **使用 `ExcelWriter` 的追加写入能力** | 利用 `startrow` 动态计算下一行位置,实现“流式写入” | | **不缓存任何数据块(`chunks = []` 被移除)** | 每次读取一张表就立即写入 Excel,内存中只保留当前表 | | **零 `pd.concat` 操作** | 彻底消除因合并 DataFrame 导致的内存翻倍问题 | | **显式控制表头写入一次** | `header=not sheet_written` 保证只写一次列名 | > ✅ 此方案可处理 **TB级以下数据**,只要单个 sheet 不超过内存即可。 --- ### 🔍 为什么这能解决 `MemoryError`? - 原因:`pd.concat(chunks)` 会在内存中同时保留原始各块 + 新合并数组 → 内存瞬间翻倍。 - 本方案:每处理完一个 sheet 就写入文件并丢弃 → 内存只保留 **当前 sheet 数据**。 - 即使有 1000 个文件,也只占用单个文件的内存空间。 --- ### ⚠️ 注意事项 1. **Excel 行数限制**:`.xlsx` 单表最多 1048576 行,接近时建议改用 `.csv`。 2. **性能提示**:频繁调用 `to_excel` 会有 I/O 开销,但远小于内存溢出风险。 3. **临时文件问题**:使用 `with pd.ExcelWriter` 可确保临时文件正确清理,避免 `[WinError32]` 错误。 --- # 知识点(列出该代码中遇到的知识点) - **$ExcelWriter$ 的动态写入机制** 利用 `startrow` 和已有 `sheet.max_row` 实现跨 multiple $DataFrame$ 追加写入。 - **零内存累积的数据流设计** 不缓存中间结果,每批次处理后立即释放,适用于超大数据集。 - **文件名解析与字段注入** 从文件名提取日期并作为新列加入 $DataFrame$,常用于日志类数据整合。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值