我正在开展一个项目,该项目从两个 NetCDF 文件中获取数据,每个文件大小为 521.8 MB。诚然,这些文件相当大。我正在使用 MacBook Pro,它有 4 GB 的内存,但电脑大约有 4 年的历史。代码是用 Python 编写的。
这些文件包含全局一年的天气数据。它是一个 4D 数组,包含时间(长度 1460)、高度(长度 17)、纬度(长度 73)和经度(长度 144)。我一次只需要该信息的某些部分。具体来说,我需要所有时间,但只需要一个海拔高度,并且只需要一个特定的纬度和经度区域 (20x44)。
我有代码从这两个文件中收集所有这些数据,只识别我需要的数据,执行计算,并将数据输出到一个文本文件中。完成那一年后,它循环遍历 63 年的数据,即 126 个同等大小的文件。现在,代码说它在进程开始时内存不足。相关代码好像是:
from mpl_toolkits.basemap.pupynere import NetCDFFile
#Create the file name for the input data.
ufile="Flow/uwnd."+str(time)+".nc"
vfile="Flow/vwnd."+str(time)+".nc"
#Get the data from that particular file.
uu=NetCDFFile(ufile)
vv=NetCDFFile(vfile)
#Save the values into an array (will be 4-dimentional)
uwnd_short=uu.variables['uwnd'][:]
vwnd_short=vv.variables['vwnd'][:]
因此,第一部分创建 NetCDF 文件的名称。第二部分从 NetCDF 文件中获取所有数据。第三部分获取导入的数据并将其放入 4D 数组中。 (由于 Python 处理数据的方式,这在技术上可能不是一个数组,但由于我的 C++ 背景,我认为它是一个数组。抱歉缺乏适当的词汇。)稍后,我分离出我需要的特定数据从 4D 阵列并执行必要的计算。问题是这曾经有效,但现在我的计算机在处理 vv=NetCDFFile(vfile) 行时内存不足。
某处可能存在内存泄漏吗?有没有办法只获取我需要的特定范围的数据,这样我就不会引入整个文件?从引入数据到整理出我需要用它执行计算的数据部分,是否有更有效的方法?
请您参考如下方法:
您可能需要做的是使用 nccopy 将文件重新分块,然后处理这些分块,因为一些变量似乎很大以适合内存。那或获得更多内存(或虚拟内存。)
nccopy 文档在这里 http://www.unidata.ucar.edu/software/netcdf/docs/guide_nccopy.html
