Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
netcdf4 python:内存随着从netcdf对象切片数据的多次调用而增加_Python_Memory Management_Netcdf - Fatal编程技术网

netcdf4 python:内存随着从netcdf对象切片数据的多次调用而增加

netcdf4 python:内存随着从netcdf对象切片数据的多次调用而增加,python,memory-management,netcdf,Python,Memory Management,Netcdf,我正在尝试使用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_m

我正在尝试使用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()

我认为问题在于对dela含义的误解

根据:

删除名称将从本地或全局命名空间中删除该名称的绑定,具体取决于该名称是否出现在同一代码块的全局语句中

这意味着
dela
取消对a变量的引用,但这并不意味着内存将立即释放,这取决于垃圾收集器的工作方式。您可以要求垃圾收集器使用collect()方法收集新垃圾:


相关帖子可能很有用。

@user308827您能在看到内存泄漏的地方发布一些代码和/或版本信息吗?在使用Python 2.7.6、netcdf4 1.1.9和psutil 3.1.1的类似示例中,我无法看到泄漏。您可以使用命令
pip freeze
获取模块版本信息。您确定外部循环的每次迭代都会增加内存使用量,而不仅仅是内部循环的每次迭代?您是否尝试过gc-垃圾收集器接口()?有趣的是,我在Windows上没有看到这个问题。你可以添加一个数据集来测试它吗?谢谢@SimoV8,我仍然很好奇为什么我只在Mac上看到内存问题而没有在Windows上看到。我不能确定,但我认为是由于垃圾收集器的不同实现。
import gc
gc.collect()