我正在开发一个从两个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)
行上工作时内存不足。
某处可能存在内存泄漏吗?有没有办法只获取我需要的特定数据范围,所以我没有引入整个文件?是否有更有效的方法可以将数据用于整理我需要用它执行计算的数据部分?
答案 0 :(得分:3)
您可能需要做的是使用nccopy重新包装文件,然后处理块,因为某些变量看起来很大以适应内存。那或者获得更多内存(或虚拟内存。)
nccopy docs在这里http://www.unidata.ucar.edu/software/netcdf/docs/guide_nccopy.html
答案 1 :(得分:0)
为了它的价值,我确实最终在我的计算机上有太多的数据并且内存不足。我让我的外置硬盘工作,并删除了一堆文件。然后,我最终弄清楚如何使用ncgen,ncdump等。我能够从每个大文件中获取所需的数据,并创建一个只包含其中数据的新文件。这使我的NetCDF文件从500MB减少到5MB。这使代码运行得更快。