1

我从这里获得了名为precip.mon.total.v6.nc的 netCDF 文件。我ncdf在 R 中使用包来打开和分析文件。

 new <- open.ncdf("precip.mon.total.v6.nc")
    > new
    [1] "file precip.mon.total.v6.nc has 4 dimensions:"
    [1] "lat   Size: 360"
    [1] "lon   Size: 720"
    [1] "nbnds   Size: 2"
    [1] "time   Size: 1320"
    [1] "------------------------"
    [1] "file precip.mon.total.v6.nc has 1 variables:"
    [1] "float precip[lon,lat,time]  Longname:GPCC Monthly total of     precipitation Missval:-9.96920996838687e+36"

但是当我提取变量时,我得到了错误

      > get.var.ncdf(new, "precip")
Error: cannot allocate vector of size 2.5 Gb
In addition: Warning messages:
1: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
2: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
3: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
4: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)

我的疑问是:(a)如何处理内存问题?(b) 如何将此 netCDF 文件的分辨率从 0.5*0.5 更改为 0.25*0.25 数据?我在 MATLAB 中尝试过类似的问题。对于 netCDF 文件,它可以比 R 更好地解决内存问题。但是改变分辨率仍然是一个问题,因为我不擅长 MATLAB。我将非常感谢这方面的任何帮助。

4

2 回答 2

9

提取变量时,您需要指定所需的维度。目前您要求 R 获取所有内容,因此我怀疑它正在创建一个可能非常庞大的 3D 数组。

ncdf4 包通常取代 ncdf,您应该尝试使用它。您需要决定是按位置读取时间数据还是按时间步长读取位置数据。这在普通的 2D 网格上更容易设想:

  • 所有时间步长的单个单元格
  • 所有位置单时间步长

你的是一个 3D 网格通过时间(尽管第三维只有两个波段),但是看起来你的变量没有使用波段维度。这是一个基于 ncdf4 的 2D 工作流程,忽略您的乐队:

包裹:

install.packages("ncdf4")
library(ncdf4)

打开连接:

nc = nc_open("~/dir/dir/file.nc")

对于一个时间步长的网格

读取尺寸:

precip = list()
precip$x = ncvar_get(nc, "lon")
precip$y = ncvar_get(nc, "lat")

读取数据(注意 start 是要开始的维度索引, count 是从该点开始的观察次数,所以这里我们在第一个时间步读取整个网格):

precip$z = ncvar_get(nc, "precip", start=c(1, 1, 1), count=c(-1, -1, 1))
# Convert to a raster if required
precip.r = raster(precip)

在所有时间步读取单个单元格

您需要找到您的单元格索引,precip$x并且precip$y会有所帮助。一旦你有了它(例如单元格 x=5 和 y=10):

precip.cell = ncvar_get(nc, "precip", start=c(5, 10, 1), count=c(1, 1, -1))
于 2015-08-24T13:46:20.913 回答
1

(a) 记忆:

如果在 linux 机器上 [sudo apt-get install cdo](或者安装了 cygwin 的 Windows),您可以使用 cdo 来帮助您。

例如,如果您只对特定日期感兴趣,则可以先选择该日期以减小文件大小:

cdo seldate,date in.nc out.nc 

或者您可能想查看时间的意思:

cdo timmean in.nc out.nc 

这将减小文件大小,然后您可以在 R 中打开它来制作您的绘图(或使用 ncview 进行快速查看调查)。

(b) 重新映射

cdo 还可以将文件内插到 0.25 度,(尽管我不确定您为什么要这样做,因为您没有添加任何信息,而是使文件大了四倍!!!)

cdo remapcon,r1440x720 in.nc out.nc

或者

cdo remapnn,r1440x720 in.nc out.nc

但正如我所说,如果你想插值以与另一个 0.25 度产品(例如 TRMM)进行比较,最好另辟蹊径,将更精细的数据集插值到 0.5 度。

顺便说一句,2015年发布了GPCC的v7,还是0.5度。

于 2017-06-07T20:15:36.570 回答