在python中处理非常大的netCDF文件

时间:2012-08-22 07:03:17

标签: python numpy netcdf

我正在尝试处理来自非常大的netCDF文件(每个大约400 Gb)的数据。每个文件都有一些变量,都比系统内存大得多(例如180 Gb vs 32 Gb RAM)。我试图使用numpy和netCDF4-python通过一次复制一个切片并对该切片进行操作来对这些变量进行一些操作。不幸的是,读取每个切片需要很长时间,这会影响性能。

例如,其中一个变量是形状(500, 500, 450, 300)的数组。我想对切片[:,:,0]进行操作,因此我执行以下操作:

import netCDF4 as nc

f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]

但最后一步需要很长时间(在我的系统上约5分钟)。例如,如果我在netcdf文件中保存了形状(500, 500, 300)的变量,那么相同大小的读取操作将只需几秒钟。

有什么方法可以加快速度吗?一个明显的路径是转置数组,以便我选择的索引首先出现。但是在如此大的文件中,这在内存中是不可能的,并且考虑到简单的操作已经花费很长时间,尝试它似乎更慢。我想要的是以Fortran的界面get_vara函数的方式快速读取netcdf文件的片段。或者某种有效转置数组的方法。

2 个答案:

答案 0 :(得分:8)

您可以使用nccopy实用程序将netCDF变量转换得太大,以适应内存:此处记录了这一点:

http://www.unidata.ucar.edu/netcdf/docs/guide_nccopy.html

这个想法是通过指定块的形状(多维图块)来“重新”重新编目文件 你想要变量。您可以指定要用作缓冲区的内存量以及要使用的内存量 用于块缓存,但目前尚不清楚如何在这些用途之间最佳地使用内存,所以你 可能只需要尝试一些例子并计算时间。而不是完全转置变量, 您可能希望通过指定包含大量数据的块来“部分转置”它 切片的2个大尺寸,沿其他尺寸只有几个值。

答案 1 :(得分:3)

这是评论,不是答案,但我不能对上述内容发表评论,抱歉。

我们了解您要在myvar[:,:,i]中使用i处理range(450)。在这种情况下,您将执行以下操作:

for i in range(450):
    myslice = myvar[:,:,i]
    do_something(slice)

,瓶颈在于访问myslice = myvar[:,:,i]。您是否尝试比较访问moreslices = myvar[:,:,0:n]所需的时间?这将是contiguos数据,也许你可以节省时间。您可以选择与您的内存一样大的n,然后处理下一个数据块moreslices = myvar[:,:,n:2n],依此类推。