如何按内存限制(如1MB)迭代读取Excel至Pandas DataFrame?
按内存限制读取Excel文件的对应内容(pandas实现)
因为Excel是结构化二进制格式,无法直接像文本文件那样截断前1MB字节解析(会破坏文件结构导致报错),推荐用迭代读取行+累计内存占用的方式实现需求,具体如下:
实现思路
- 用
pandas.read_excel的chunksize参数分批读取数据,每次读取一小批行 - 计算每批DataFrame的实际内存占用(包含对象类型的深层内存)
- 累计已读取的内存,当接近或达到设定的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
相关产品推荐
相关产品推荐

