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()
4

1 回答 1

1

del a我认为问题在于对含义的误解。

根据Python 语言参考

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

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

import gc
gc.collect()

这个相关的帖子可能很有用。

于 2015-08-19T15:16:24.027 回答