Python读取文本文件内容添加到字典时出现内存泄漏问题求助
内存泄漏原因
- NumPy切片视图隐式持有原始数组引用:你代码中
array = output[:,1]生成的是原始output数组的切片视图,而非独立副本。视图会一直持有整个原始output数组的引用,哪怕你主动删除output变量,只要array还存储在字典中,完整的output数组内存就无法被释放。你统计的字典大小仅计算了视图本身的容量,未计入其引用的完整原始数组内存,所以会出现字典涨幅远低于系统内存涨幅的情况,这是最核心的泄漏原因。 - NumPy内存池延迟释放:NumPy使用独立的内存池管理内存分配,即便Python层面的数组对象已经被垃圾回收,对应的内存会先被放回NumPy内存池复用,不会立刻归还给操作系统,因此htop统计的进程常驻内存会持续上涨,不会实时下降。
解决方法
- 切片时强制生成独立副本:将切片行修改为
array = output[:,1].copy(),直接切断视图和原始output数组的引用关系,删除output后其占用的内存就可以被正常回收。 - 直接读取目标列,避免加载全量文件内容:不用先读取整个txt文件再切片,直接指定
np.loadtxt的usecols参数只读第二列,从源头减少不必要的内存占用:
也可以替换为性能更高的array = np.loadtxt(filename, usecols=1)pandas.read_csv指定usecols参数读取,内存开销会更低。 - 关闭NumPy内存池(可选):如果确认是内存池延迟释放导致的占用虚高,可以在脚本开头设置环境变量关闭NumPy内存池,让释放的内存直接归还操作系统:
import os os.environ['NUMPY_MALLOC_MAX_ALIGN'] = '0'
内容的提问来源于stack exchange,提问作者Nassim
相关产品推荐
相关产品推荐

