netcdf4-python: объем памяти увеличивается за счет многочисленных вызовов среза данных из объекта netcdf

Я пытаюсь прочитать фрагменты данных из файла netcdf4 с помощью netcdf4-python. Это первый раз, когда я использую 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()

person user2870145    schedule 11.10.2013    source источник
comment
@ user308827 Можете ли вы опубликовать информацию о коде и / или версии, где вы видите утечку памяти? Мне не удалось увидеть утечку в аналогичном примере с использованием Python 2.7.6, netcdf4 1.1.9 и psutil 3.1.1. Вы можете получить информацию о версии модуля с помощью команды pip freeze.   -  person heenenee    schedule 12.08.2015
comment
Вы уверены, что использование памяти увеличивается для каждой итерации внешнего цикла, а не только для каждой итерации внутреннего цикла?   -  person Patrick Maupin    schedule 13.08.2015
comment
Вы пробовали gc - интерфейс сборщика мусора (docs.python.org/2/library/gc .html)?   -  person Damián Montenegro    schedule 18.08.2015
comment
Что интересно, я не вижу этой проблемы в Windows. просто Mac OS   -  person user308827    schedule 18.08.2015
comment
вы можете добавить набор данных для тестирования?   -  person Padraic Cunningham    schedule 19.08.2015


Ответы (1)


Я думаю, проблема в неверном истолковании значения del a.

Согласно справочнику по языку Python:

Удаление имени удаляет привязку этого имени к локальному или глобальному пространству имен, в зависимости от того, встречается ли имя в глобальном операторе в том же блоке кода.

Это означает, что del a разыменовать переменную, но это не означает, что память будет немедленно освобождена, это зависит от того, как работает сборщик мусора. Вы можете попросить сборщик мусора собрать новый мусор с помощью метода collect ():

import gc
gc.collect()

Этот связанный пост может быть полезен.

person SimoV8    schedule 19.08.2015
comment
спасибо @ SimoV8, все еще любопытно, почему я вижу проблему с памятью только на Mac, а не в окнах - person user308827; 20.08.2015
comment
Я не могу сказать наверняка, но думаю, это связано с другой реализацией сборщика мусора. - person SimoV8; 21.08.2015