2013-08-06 23 views
2

我正在从两个NetCDF文件中获取数据,每个文件都是521.8 MB。无可否认,这些都是相当大的文件。我正在研究一台MacBook Pro,它有4 GB的内存,但电脑大约4岁。代码是用Python编写的。导入大型数据文件的有效方法,Python

这些文件包含一年的全球天气数据。它是包含时间(长度1460),高度(长度17),纬度(长度73)和经度(长度144)的4D阵列。我一次只需要这些信息的某些部分。具体来说,我需要所有的时间,但只有一个高度水平,只有一个特定的经纬度区域(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)行时耗尽内存。

是否有可能发生内存泄漏?有没有办法只得到我需要的特定范围的数据,所以我没有引入整个文件?是否有一种更有效的方法可以将数据带入整理我需要用来执行计算的数据部分?

+1

如果可能,请从您正在导入的文件中提供几行示例数据。 – ChrisProsser

+0

当我导入一个文件,将它保存到一个数组,然后输出数组,我得到以下内容: '[[[4.10000610e + 00 4.50001526e + 00 4.80000305e + 00 ..., 2.90000916e + 00 3.30000305e + 00 3.70001221e + 00] [3.00001526e + 00 3.50001526e + 00 3.90000916e + 00 ..., 1.60000610e + 00 2.10000610e + 00 2.50001526e + 00] [-9.99984741e-01 - 6.99996948e-01 -3.99993896e-01 ..., -1.49998474e + 00 -1.39999390e + 00 -1.19999695e + 00] ...,'数字当然继续,我稍后使用一个比例和偏移量。 – Stephen

+0

感谢我终于搞清楚了ncdump,输出看起来像这样:-16146,-16176,-16226,-16306,-16436,-16616,-16836,-17056,-17286,-17506,-17706,-17866 ,-17976,-18016,-17996,-17916,-17776,-17566,-17306,-17016,-16746,-16526,-16416,-16416,-16496,-16606,-16726, – Stephen

回答

3

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

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

+0

“获得更多的记忆“ - 即使我们假设没有足够的记忆可用于此,那不应该意味着程序会恰好崩溃吗?这不是页面文件和/交换的目的吗? – pzkpfw

+0

我不确定我明白重新做什么。原始文件中四个维度的长度分别为1464,17,73和144.我尝试将其重新分配到1464,17,50和50,新文件为750 MB(原始为522 MB)。当我将它重新绑定到1464,17,20和20时,新文件为637 MB。这对我来说似乎并不小或更有效。有什么我失踪? – Stephen

0

对于它的价值,我也拉闸有我的电脑上太多的数据,并运行内存。我让我的外部硬盘工作,并删除了一堆文件。然后,我最终弄清楚了如何使用ncgen,ncdump等。我能够从每个大文件中只找到需要的数据,并创建一个只包含该数据的新文件。这将我的NetCDF文件从500MB减少到5MB。这使得代码运行得更快。

+0

我经常使用'ncks'来将全局文件转换为经纬度带以实现高效的内存读写。 http://nco.sourceforge.net/nco.html#ncks-netCDF-Kitchen-Sink – N1B4