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

切片NumPy数组时降低内存占用的方法求助

解决NumPy大数组处理后的内存释放问题

我完全懂你这种头疼的感觉——处理大NumPy数组时,明明删了对象、设成None,内存还是居高不下,简直像被“占着茅坑不拉屎”一样。其实这背后是Python垃圾回收和NumPy内存管理的小坑,我给你拆解下解决方案:

核心问题:为什么del和None没生效?

Python的垃圾回收(GC)是自动且延迟的,尤其是当你在全局作用域操作变量时,可能存在一些你没注意到的隐式引用(比如交互环境的历史记录、其他变量的间接引用),导致NumPy数组占用的内存没被立刻释放。另外,NumPy数组的内存是直接在堆上分配的,光删除Python层的对象引用,有时候GC不会马上清理这部分内存。

有效解决方案:分步骤强制内存回收

1. 把单文件处理逻辑封装成函数

函数的局部变量在执行完毕后会被自动标记为可回收,比在全局作用域里处理更彻底。配合手动触发GC,能快速释放内存:

import numpy as np
import gc

def process_single_file(file_path):
    # 读取文件中的数组列表(假设你用np.save存的pickle格式)
    raw_data = np.load(file_path, allow_pickle=True)
    # 提取第10到20列(注意NumPy是左闭右开,所以要写到21)
    extracted_cols = [arr[:, 10:21] for arr in raw_data]
    
    # 先删除原数据的引用
    del raw_data
    # 手动触发垃圾回收,强制释放内存
    gc.collect()
    
    return extracted_cols

# 依次处理所有文件
final_results = []
for file_name in ["file1.npy", "file2.npy", "file3.npy", "file4.npy"]:
    batch_data = process_single_file(file_name)
    final_results.extend(batch_data)
    # 清理当前批次的临时引用
    del batch_data
    gc.collect()

2. 进一步优化:边处理边写入磁盘(避免内存堆积)

如果最终不需要把所有提取的数据都放在内存里,建议处理一个文件就把结果写入磁盘,这样内存占用会降到最低:

def process_and_save(file_path, output_file):
    raw_data = np.load(file_path, allow_pickle=True)
    extracted_cols = [arr[:, 10:21] for arr in raw_data]
    
    del raw_data
    gc.collect()
    
    # 追加写入到输出文件(用ab模式避免覆盖)
    with open(output_file, "ab") as f:
        np.save(f, extracted_cols)
    
    # 清理当前提取结果的引用
    del extracted_cols
    gc.collect()

# 逐个处理并保存结果
output_path = "extracted_columns.npy"
for file_name in ["file1.npy", "file2.npy", "file3.npy", "file4.npy"]:
    process_and_save(file_name, output_path)

3. 验证内存是否真的释放

可以用psutil库监控内存使用,确认处理前后的内存变化:

import psutil

def get_current_memory_mb():
    process = psutil.Process()
    return round(process.memory_info().rss / (1024 ** 2), 2)

print(f"初始内存占用: {get_current_memory_mb()} MB")
# 执行你的处理代码...
print(f"处理后内存占用: {get_current_memory_mb()} MB")

额外注意点

  • 如果你的文件是用内存映射方式读取的(比如np.load(mmap_mode='r')),记得先关闭映射再删除引用;
  • 避免在交互环境(比如Jupyter Notebook)里测试,因为交互环境会保留变量的历史引用,导致内存无法释放,建议用普通.py脚本运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:33:32