我刚开始使用Xarray (在jupyter笔记本中使用Xarray),到目前为止,除了我开始研究函数(例如htop)使用了多少RAM之外,到目前为止,一切都很有魅力,这让我感到困惑(我在stackexchange上没有发现任何东西)。
我将月数据与年度数据结合起来,考虑到月长、掩蔽nan值以及仅使用特定月份,这需要使用groupby和重采样。从使用内存分析器可以看出,这些操作暂时占用了~15 at,这本身并不是一个问题,因为我手头有64 at的RAM。尽管如此,有些内存似乎被永久阻塞,尽管我在函数中调用了这些方法。对于它下面的函数,它会阻塞~4gb的内存,尽管结果xarray的大小只有~440 of (55*10**6浮点数64条目),但是操作比较复杂,它会阻塞更多的内存。在函数中显式使用del、gc.collect()或Dataarray.close()不会改变任何事情。
根据每月数据计算加权年平均值的基本函数如下:
代码语言:javascript复制import xarray as xr
test=xr.open_dataset(path)['pr']
def weighted_temporal_mean(ds):
"""
Taken from https://ncar.github.io/esds/posts/2021/yearly-averages-xarray/
Compute yearly average from monthly data taking into account month length and
masking nan values
"""
# Determine the month length
month_length = ds.time.dt.days_in_month
# Calculate the weights
wgts = month_length.groupby("time.year") / month_length.groupby("time.year").sum()
# Setup our masking for nan values
cond = ds.isnull()
ones = xr.where(cond, 0.0, 1.0)
# Calculate the numerator
obs_sum = (ds * wgts).resample(time="AS").sum(dim="time")
# Calculate the denominator
ones_out = (ones * wgts).resample(time="AS").sum(dim="time")
# Return the weighted average
return obs_sum / ones_out
wm=weighted_temporal_mean(test)
print("nbytes in MB:", wm.nbytes / (1024*1024))是否知道如何确保内存被释放,或者我是否忽略了某些事情,而这种行为实际上是预期的?
谢谢!