Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用R更改Netcdf的变量块_R_Netcdf_Chunks - Fatal编程技术网

用R更改Netcdf的变量块

用R更改Netcdf的变量块,r,netcdf,chunks,R,Netcdf,Chunks,在使用R处理大型netcdf文件(比计算机内存大)时,我经常会遇到同样的问题。没有一种明显的方法来更改数据块。这可能是我在R中无法找到有效方法的唯一一个netcdf常见任务。我过去常常根据情况使用NCO或nccopy解决这个问题。甚至CDO也可以选择复制nc来更改块,但灵活性远远低于以前的工具。我想知道是否有任何有效的方法在R做这件事 以下示例生成一个玩具nc,分块为分块:[100100,1] library(ncdf4) foo_nc_path=paste0(tempdir(),"/thin

在使用R处理大型netcdf文件(比计算机内存大)时,我经常会遇到同样的问题。没有一种明显的方法来更改数据块。这可能是我在R中无法找到有效方法的唯一一个netcdf常见任务。我过去常常根据情况使用NCO或nccopy解决这个问题。甚至CDO也可以选择复制nc来更改块,但灵活性远远低于以前的工具。我想知道是否有任何有效的方法在R做这件事

以下示例生成一个玩具nc,分块为
分块:[100100,1]

library(ncdf4)

foo_nc_path=paste0(tempdir(),"/thing.nc")
xvals <- 1:100
yvals <- 1:100

lon <- ncdim_def("longitude", "Km_east", xvals)
lat <- ncdim_def("latitude", "Km_north", yvals)

time <- ncdim_def("Time","hours", 1:1000, unlim=TRUE)
var<- ncvar_def("foo_var", "nothing", list(lon, lat, time), chunksizes=c(100,100,1),
                      longname="xy chunked numbers", missval=-9) 

foo_nc <- nc_create(foo_nc_path, list(var))

data <- array(runif(100*100*1000),dim = c(100,100,1000))

ncvar_put(foo_nc, var, data)

nc_close(foo_nc)


####Check speed

foo_nc <- nc_open(foo_nc_path)

system.time({timestep <- ncvar_get(foo_nc,"foo_var",start = c(1,1,1),count=c(-1,-1,1))})
system.time({timeserie <- ncvar_get(foo_nc,"foo_var",start = c(1,1,1),count=c(1,1,-1))})
库(ncdf4)
foo_nc_path=paste0(tempdir(),“/thing.nc”)

这取决于你的目的。如果需要提取/分析“映射”切片(即在lat-lon矩阵上),则将分块策略保留在空间坐标上。但是,如果您希望运行时间分析(例如提取每个网格单元的时间序列以计算趋势),那么我的建议是将分块策略切换到时间维度

尝试重新运行代码,将
chunksize=c(100100,1)
替换为类似的内容,例如
chunksize=c(10,101000)
。通过这种方式,时间序列的读取速度会快得多

如果您的代码在R中的速度非常慢,您可以尝试更快的替代方法,例如(例如)
nccopy
nco

您可以使用一个简单的
nccopy
命令重新分块netcdf文件,如下所示:
nccopy-c time/1000、lat/10、lon/10 input.nc output.chunked.nc

nco
(对于此操作,我建议使用
nccopy
)中,您可以执行以下操作:

nco -O -4 -D 4 --cnk_plc g2d --cnk_dmn lat,10 --cnk_dmn lon,10 --cnk_dmn time,1000 in.nc out.nc
--cnk_dmn
指定给具有感兴趣的块大小的特定变量。更多示例请访问


无论哪种方式,您都必须对不同的块大小进行一些调整,以确定哪些块最适合您的具体情况。

这取决于您的目的。如果需要提取/分析“映射”切片(即在lat-lon矩阵上),则将分块策略保留在空间坐标上。但是,如果您希望运行时间分析(例如提取每个网格单元的时间序列以计算趋势),那么我的建议是将分块策略切换到时间维度

尝试重新运行代码,将
chunksize=c(100100,1)
替换为类似的内容,例如
chunksize=c(10,101000)
。通过这种方式,时间序列的读取速度会快得多

如果您的代码在R中的速度非常慢,您可以尝试更快的替代方法,例如(例如)
nccopy
nco

您可以使用一个简单的
nccopy
命令重新分块netcdf文件,如下所示:
nccopy-c time/1000、lat/10、lon/10 input.nc output.chunked.nc

nco
(对于此操作,我建议使用
nccopy
)中,您可以执行以下操作:

nco -O -4 -D 4 --cnk_plc g2d --cnk_dmn lat,10 --cnk_dmn lon,10 --cnk_dmn time,1000 in.nc out.nc
--cnk_dmn
指定给具有感兴趣的块大小的特定变量。更多示例请访问


无论哪种方式,您都必须对不同的块大小进行一些调整,以确定哪些块最适合您的具体情况。

没错,但如果您想将大规模nc(比如10Gb压缩)从“地图方式”更改为“时间方式”,该怎么办?块是如此的不同,即使读前一个nc来写后一个nc,也会变得非常慢R@Lacococha查看我原始答案的编辑。谢谢你的更新。正如我所说,这是我通常做的。但我想知道是否有任何方法可以在R中实现它。我想你肯定不能在R中实现它-你的代码显示了这一点。但这将是缓慢的(正如你也发现的)。你最好使用一个专门的工具。没错,但是如果你想从一个“地图方式”转变为一个“时间方式”,一个大规模的nc(比方说10Gb压缩)会怎么样?块是如此的不同,即使读前一个nc来写后一个nc,也会变得非常慢R@Lacococha查看我原始答案的编辑。谢谢你的更新。正如我所说,这是我通常做的。但我想知道是否有任何方法可以在R中实现它。我想你肯定不能在R中实现它-你的代码显示了这一点。但这将是缓慢的(正如你也发现的)。你最好使用专门的工具。