簡體   English   中英

netcdf4-python:內存越來越多,調用來自netcdf對象的切片數據

[英]netcdf4-python: memory increasing with numerous calls to slice data from netcdf object

我正在嘗試使用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()

我認為這個問題是del a意義的誤解。

根據Python語言參考

刪除名稱將刪除該名稱與本地或全局名稱空間的綁定,具體取決於名稱是否出現在同一代碼塊中的全局語句中。

這意味着del a取消引用一個變量,但這並不意味着內存將立即釋放,這取決於垃圾收集器的工作方式。 您可以使用collect()方法要求垃圾收集器收集新垃圾:

import gc
gc.collect()

這篇相關文章很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM