You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按内存限制(如1MB)迭代读取Excel至Pandas DataFrame?

按内存限制读取Excel文件的对应内容(pandas实现)

因为Excel是结构化二进制格式,无法直接像文本文件那样截断前1MB字节解析(会破坏文件结构导致报错),推荐用迭代读取行+累计内存占用的方式实现需求,具体如下:

实现思路

  1. 用pandas.read_excel的chunksize参数分批读取数据,每次读取一小批行
  2. 计算每批DataFrame的实际内存占用(包含对象类型的深层内存)
  3. 累计已读取的内存,当接近或达到设定的1MB限制时停止迭代,合并已读取的批次

代码示例

import pandas as pd

# 设定内存限制:1MB = 1024*1024字节
MEMORY_LIMIT = 1 * 1024 * 1024
excel_path = "your_large_excel_file.xlsx"

# 初始化变量
total_memory = 0
collected_data = []

# 按批次迭代读取Excel,chunksize可根据实际调整
for chunk in pd.read_excel(excel_path, chunksize=100):
    # 计算当前批次的真实内存占用(deep=True计算字符串等对象的实际内存)
    chunk_memory = chunk.memory_usage(deep=True).sum()
    
    # 判断加上当前批次是否超过内存限制
    if total_memory + chunk_memory > MEMORY_LIMIT:
        # 计算当前批次能取的行数(近似值)
        rows_allowed = int((MEMORY_LIMIT - total_memory) / (chunk_memory / len(chunk)))
        if rows_allowed > 0:
            collected_data.append(chunk.iloc[:rows_allowed])
            total_memory += chunk_memory / len(chunk) * rows_allowed
        break
    else:
        collected_data.append(chunk)
        total_memory += chunk_memory

# 合并所有读取的数据
final_df = pd.concat(collected_data, ignore_index=True)

print(f"已读取数据内存占用:{total_memory/1024/1024:.2f} MB")
print(f"已读取行数:{len(final_df)}")

关键说明

  • memory_usage(deep=True):必须添加deep=True,否则pandas仅计算列元数据内存,会忽略字符串、列表等对象类型的实际占用,导致估算偏差极大
  • chunksize:值越小,内存控制越精确,但迭代次数会增加,可根据Excel行平均内存占用调整(每行内存大就设小,反之设大)
  • 内存估算的近似性:pandas的内存占用和原始Excel文件字节数不完全等价,但能满足"控制内存不超1MB"的核心需求
  • 引擎兼容性:openpyxl(xlsx格式)和xlrd(xls格式)都支持chunksize参数,无需额外配置

内容的提问来源于stack exchange,提问作者Ravi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:42:45