netcdf4-python:使用多次从netcdf对象中切片数据会增加内存消耗

9

我正在尝试使用netcdf4-python从netcdf4文件中读取数据切片。这是我第一次使用Python,并且遇到了内存问题。以下是代码的简化版本。在循环的每个迭代中,内存会跳过我所读取的数据切片的等价物。我如何在迭代每个变量时清理内存?

#!/usr/bin/env python
from netCDF4 import Dataset
import os
import sys
import psutil

process = psutil.Process(os.getpid())


def print_memory_usage():
    nr_mbytes = process.get_memory_info()[0] / 1048576.0
    sys.stdout.write("{}\n".format(nr_mbytes))
    sys.stdout.flush()

# open input file and gather variable info

rootgrp_i = Dataset('data.nc','r')
vargrp_i = rootgrp_i.variables
# lets create a dictionary to store the metadata in
subdomain = {}
for suff in range(1000):

    for var in vargrp_i:
        v_i = vargrp_i[var]
        if v_i.ndim == 1:
           a=v_i[:]
        elif v_i.ndim == 2:
           a=v_i[0:20, 0:20]
        elif v_i.ndim == 3:
           a=v_i[0, 0:20, 0:20]
        elif v_i.ndim == 4:
           a=v_i[0, 0:75, 0:20, 0:20]
        else:
           a=v_i[0]
        del a
        print_memory_usage()

rootgrp_i.close()

@user308827 你能贴出代码和/或版本信息,在哪里看到了内存泄漏吗?我使用类似的示例在Python 2.7.6、netcdf4 1.1.9和psutil 3.1.1中未能发现泄漏。你可以使用命令pip freeze获取模块版本信息。 - heenenee
你确定内存使用量是在外部循环的每次迭代中增加,而不仅仅是在内部循环的每次迭代中增加吗? - Patrick Maupin
你尝试过使用垃圾回收接口(https://docs.python.org/2/library/gc.html)吗? - Damián Montenegro
有趣的是,在Windows上我没有看到这个问题,只在Mac OS上出现。 - user308827
1
你能添加一个数据集来测试吗? - Padraic Cunningham
1个回答

1
我认为问题在于误解了del a 的含义。
根据Python语言参考
删除一个名称会从本地或全局命名空间中删除该名称的绑定,具体取决于该名称是否出现在同一代码块中的全局语句中。
这意味着del a取消对a变量的引用,但这并不意味着内存将立即被释放,这取决于垃圾回收器的工作方式。您可以使用collect()方法要求垃圾回收器收集新的垃圾:
import gc
gc.collect()

此相关文章可能会有所帮助:

This


谢谢@SimoV8,我仍然很好奇为什么我只在Mac上看到内存问题,而不是Windows上。 - user308827
我不能确定,但我认为这是由于垃圾收集器的不同实现所致。 - SimoV8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接