加载多份pickle文件时进程持续终止,求内存不足解决办法
解决大Pickle数据集加载内存不足的方案
你遇到的这个问题我之前处理图数据训练时也碰到过——64GB内存看似充裕,但Pandas加载大Pickle文件时的内存开销经常会超出预期(毕竟Pickle是序列化对象,加载时的内存占用往往比磁盘文件大不少)。结合你的场景,给你几个实用的解决思路:
先优化单文件内存占用,再逐步合并
先单独加载每个Pickle文件,对DataFrame做内存瘦身:- 用
df.memory_usage(deep=True)查看各列的内存占用,把重复值多的字符串列(比如节点类型、标签)转成category类型; - 数值类型降精度:如果节点特征不需要高精度,把
float64转成float32,int64转成int32甚至int16(前提是数值范围足够); - 处理完单个文件后,保存成Parquet/Feather格式(这两种是列式存储,压缩率高,加载时内存占用比Pickle小很多),再合并这些优化后的文件。
- 用
用延迟加载框架替代Pandas全量加载
如果必须操作全量节点数据,试试用Dask DataFrame或者Vaex:- Dask会把数据分成多个分区,仅在需要计算时才加载对应分区到内存,完全兼容Pandas API,你可以像操作普通DataFrame一样处理全量数据,训练时也能按分区取数据喂给模型;
- Vaex则用内存映射技术,直接从磁盘读取数据而不加载到内存,适合超大规模数据集的快速操作。
分批次加载+增量构建模型输入
若不需要把所有节点同时放在内存里做预处理,试试分批次处理:- 每次加载一个Pickle文件,处理完节点特征(比如归一化、编码)后,把需要的特征和邻接关系保存成模型训练友好的格式(比如numpy数组、TensorFlow Dataset/PyTorch DataLoader支持的格式);
- 用生成器或Dataset类,训练时动态从磁盘读取批次数据,无需把全量数据放在内存中。
手动清理内存碎片
加载完一个文件处理后,及时释放内存:import gc # 处理完当前文件的DataFrame后 del df_current gc.collect()这样能避免多个文件加载后内存碎片累积,导致后续加载时内存不足。
排查内存泄漏
如果以上方法都没用,可能是代码存在内存泄漏(比如某些变量被意外引用,无法被GC回收)。可以用memory_profiler工具逐行检查内存占用,定位内存持续增长的代码段。
内容的提问来源于stack exchange,提问作者Cesarior
相关产品推荐
相关产品推荐

