如何解决Pandas中出现的内存不足(out of memory)错误?
解决重复读取CSV时内存不足的问题
可能的原因及对应解决方案
1. 强制释放前一次读取的内存
Python的垃圾回收机制不会立即彻底释放已删除对象的内存,尤其是在交互式环境(如Jupyter Notebook)中,残留的内存占用会导致二次读取时OOM。可以手动触发回收:
import gc # 删除之前的DataFrame变量 del df # 强制执行垃圾回收 gc.collect() # 重新读取数据 df = pd.read_csv('ip.csv', encoding='cp1252')
2. 从读取阶段压缩内存占用
即使第一次读取显示仅17.1MB,内存碎片或进程占用可能导致二次读取失败,直接优化读取时的内存开销:
- 指定列的精确数据类型:避免pandas自动推断出冗余的大类型(比如将
int64改为int32,字符串列改为category类型):
先查看各列的类型分布:
再手动指定类型读取:sample_df = pd.read_csv('ip.csv', encoding='cp1252', nrows=100) print(sample_df.dtypes)dtype_config = { 'user_id': 'int32', 'status': 'category', 'score': 'float32' # 根据实际列补充配置 } df = pd.read_csv('ip.csv', encoding='cp1252', dtype=dtype_config) - 仅读取需要的列:直接跳过不需要的列,减少加载的数据量:
required_cols = ['user_id', 'status', 'score'] # 替换为你需要的列名 df = pd.read_csv('ip.csv', encoding='cp1252', usecols=required_cols)
3. 分块读取CSV文件
如果CSV文件存在隐藏的大内容(比如某些行有异常长的文本),分块读取可以避免一次性加载全部数据:
# 按10000行一块读取 chunk_generator = pd.read_csv('ip.csv', encoding='cp1252', chunksize=10000) # 逐块处理并合并 processed_chunks = [] for chunk in chunk_generator: # 对块做预处理,比如删除无用列 chunk = chunk.drop(columns=['unused_col1', 'unused_col2']) processed_chunks.append(chunk) df = pd.concat(processed_chunks, ignore_index=True)
4. 检查系统内存占用
二次读取失败可能是其他进程占用了大量内存,导致可用空间不足。可以通过系统工具排查:
- Linux/macOS:终端执行
free -h查看内存使用情况,关闭不必要的进程 - Windows:打开任务管理器,结束占用内存较高的非必要进程
内容的提问来源于stack exchange,提问作者user20991323
相关产品推荐
相关产品推荐

