2

我正在开发一个从两个 NetCDF 文件中获取数据的项目,每个文件都是 521.8 MB。诚然,这些是相当大的文件。我正在使用具有 4 GB 内存的 MacBook Pro,但计算机已经使用了大约 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)在线工作时内存不足。

某处可能存在内存泄漏吗?有没有办法只获取我需要的特定数据范围,所以我不带入整个文件?从引入数据到整理出我需要使用它执行计算的数据部分,有没有更有效的方法?

4

2 回答 2

3

您可能需要做的是使用 nccopy 重新分块文件,然后处理这些块,因为某些变量似乎很大以适合内存。那或获得更多内存(或虚拟内存。)

nccopy 文档在这里http://www.unidata.ucar.edu/software/netcdf/docs/guide_nccopy.html

于 2013-08-06T16:49:39.000 回答
0

对于它的价值,我的计算机上确实有太多数据并且内存不足。我让我的外部硬盘驱动器工作,并删除了一堆文件。然后,我最终弄清楚了如何使用 ncgen、ncdump 等。我能够从每个大文件中只取出我需要的数据,并创建一个只包含这些数据的新文件。这将我的 NetCDF 文件从 500MB 减少到 5MB。这也使代码运行得更快。

于 2014-08-09T18:30:15.350 回答