Pandas填充NaN为0遇MemoryError,16GB内存Win11环境下如何解决?
解决Pandas填充NaN时的内存错误及内存分配方案
核心原因
你的DataFrame计算后需要约10GiB内存,而16GB物理内存会被系统和其他进程占用一部分,实际可用内存不足以一次性处理整个数据集,因此触发内存错误。以下是具体解决方案:
1. 优化数据类型(最优先)
float64类型每个元素占8字节,将其降级为更低精度的浮点类型可直接减半甚至四分之一内存占用:
- 如果精度允许,转为
float32(占4字节):df = df.astype('float32') df.fillna(0, inplace=True) - 若对精度要求极低,可尝试
float16(占2字节),但注意可能出现精度损失:df = df.astype('float16') df.fillna(0, inplace=True) - 如果数据实际是整数(NaN仅表示缺失),改用Pandas的可空整数类型(如
Int32),内存占用远低于float类型:df = df.astype('Int32') df.fillna(0, inplace=True)
2. 分批处理数据集
不一次性加载/处理整个DataFrame,拆分后逐块处理:
- 若数据来自文件,读取时指定
chunksize:chunk_size = 10000 # 根据内存情况调整大小 with pd.read_csv('your_data.csv', chunksize=chunk_size) as reader: for idx, chunk in enumerate(reader): chunk.fillna(0, inplace=True) # 写入处理后的数据 if idx == 0: chunk.to_csv('filled_data.csv', index=False) else: chunk.to_csv('filled_data.csv', mode='a', header=False, index=False) - 若DataFrame已加载,手动拆分处理:
chunk_size = 10000 processed_chunks = [] for i in range(0, len(df), chunk_size): chunk = df.iloc[i:i+chunk_size].fillna(0) processed_chunks.append(chunk) df_filled = pd.concat(processed_chunks, axis=0)
3. 释放闲置内存
清理当前会话中无用的变量和内存碎片:
import gc # 删除不需要的变量 del temp_var # 替换为你的临时变量名 # 强制垃圾回收 gc.collect() # 整理DataFrame内存碎片(可选) df = df.copy()
4. 调整Windows虚拟内存
增大页面文件(虚拟内存)让系统可以用硬盘空间补充物理内存:
- 右键「此电脑」→「属性」→「高级系统设置」
- 切换到「高级」标签,点击「性能」区域的「设置」
- 在「性能选项」中选「高级」标签,点击「虚拟内存」区域的「更改」
- 取消勾选「自动管理所有驱动器的分页文件大小」
- 选择一个剩余空间充足的磁盘,设置「自定义大小」:
- 初始大小:建议设为物理内存大小(16GB即16384MB)
- 最大值:可设为32GB(32768MB)或更大(根据硬盘剩余空间)
- 点击「设置」→「确定」,重启电脑生效
5. 其他替代方案
- 使用Dask:它是Pandas的并行扩展,可自动分片处理超出内存的大数据,API与Pandas几乎一致
- 原地修改数据:用NumPy的
nan_to_num直接在原数组上替换NaN,避免额外内存复制:import numpy as np df.values[:] = np.nan_to_num(df.values, nan=0.0, copy=False)
内容的提问来源于stack exchange,提问作者JTA1618
相关产品推荐
相关产品推荐

