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

Pandas处理大CSV生成新DataFrame触发MemoryError求助

解决Pandas筛选列时触发MemoryError的问题

首先,核心问题出在你使用的32位Python版本上!

为什么会出现这个问题?

Windows系统下的32位进程默认只有2GB的虚拟地址空间上限(哪怕你的物理内存有13GB),单个32位Python进程没法突破这个限制。你看到的“内存占用从未超过3GB”是物理内存的使用情况,但实际上进程的虚拟地址空间可能已经耗尽了——当Pandas在筛选列时需要分配新的内存块,而虚拟地址空间不够时,就会触发MemoryError,这和剩余物理内存多少无关。

解决方案

1. 切换到64位Python(最根本的解决办法)

64位Python进程的虚拟地址空间几乎没有上限,能充分利用你的13GB物理内存,直接解决地址空间不足的问题。这是最推荐的方案,毕竟你处理的是超大型数据集,64位环境是刚需。

2. 优化数据加载流程,提前减少内存占用

如果你暂时没法切换版本,或者想进一步优化内存使用,可以在读取CSV时就只加载需要的列,而不是先读全量再筛选:

import pandas as pd

# 假设你需要保留原df用于计算,同时要提取前30列生成df2
# 先确定原df计算需要的列 + 要提取的30列,一起用usecols指定
required_cols = list(range(30)) + [你的计算所需列名/索引]
df = pd.read_csv('file.csv', usecols=required_cols)

# 执行你的计算逻辑
...

# 然后生成df2
df2 = df[list(range(30))]

这样一开始就不会加载不需要的170列,从根源减少内存占用,避免后续筛选时的内存压力。

3. 手动释放内存(如果后续不需要原df)

如果你的计算完成后不再需要原df,可以在生成df2前手动释放内存:

# 执行计算后
del df
import gc
gc.collect()  # 触发垃圾回收

# 再重新读取需要的30列生成df2
df2 = pd.read_csv('file.csv', usecols=list(range(30)))

4. 优化数据类型

检查数据类型,把能压缩的列转换为更节省内存的类型:

  • 对于整数列,用df['col'] = pd.to_numeric(df['col'], downcast='integer')
  • 对于字符串列,若类别有限,用df['col'] = df['col'].astype('category')
  • 对于浮点列,用df['col'] = pd.to_numeric(df['col'], downcast='float')

这些操作能大幅降低原DataFrame的内存占用,减少后续操作的内存压力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:01:21