tl; dr:为什么raster :: sampleRandom花了这么多时间?,例如从30k细胞中提取3k细胞(超过10k时间步长)。有什么办法可以改善这种情况吗? 编辑:底部的解决方法。
考虑一个R脚本,我必须读取一个大文件(通常超过2-3GB)并对数据执行分位数计算。我使用raster包来读取(netCDF
)文件。我在64位GNU / Linux下使用R 3.1.2,内存为4GB,大部分时间都可用3.5GB。
由于文件太大而无法放入内存(即使是2GB文件由于某种原因也不适合3GB的可用内存:unable to allocate vector of size 2GB
)我不能总是这样做,这就是我要做的事情有16GB的RAM:
pr <- brick(filename[i], varname=var[i], na.rm=T)
qs <- quantile(getValues(pr)*gain[i], probs=qprobs, na.rm=T, type=8, names=F)
但我可以使用sampleRaster()
包中的raster
函数在我的文件中采样较少数量的单元格,但仍然可以获得良好的统计数据。
e.g:
pr <- brick(filename[i], varname=var[i], na.rm=T)
qs <- quantile(sampleRandom(pr, cnsample)*gain[i], probs=qprobs, na.rm=T, type=8, names=F)
我在6个不同的文件中执行此操作(i
从1到6),它们都有大约30k个单元格和10k个时间步长(因此300M值)。文件是:
请注意:
sampleRandom(dataset, N)
从一个层(=一个一步)获取N个非NA随机单元格,并读取其内容。对于每个图层,对于相同的N个单元格是这样的。如果将数据集可视化为3D矩阵,以Z作为时间步长,则该函数采用N个随机非NA列。但是,我想函数不知道所有层都具有相同位置的NA,因此必须检查它选择的任何列中是否没有NA。 产生以下输出的完整脚本是here,带有注释等。
如果我尝试阅读所有30k cells:
cannot allocate vector of size 2.6 Gb
如果我看了1000 cells:
如果我看了3000 cells:
如果我尝试阅读5000 cells:
通过更多测试,我能够发现它是sampleRandom()
函数占用大部分计算时间,而不是计算分位数(其中我可以加快使用其他分位数函数,例如kuantile()
)。
sampleRandom()
花了这么长时间?为什么它表现得如此奇怪,有时很快,有时甚至很慢? raster::extract
。编辑: 工作方法是:
cells <- sampleRandom(pr[[1]], cnsample, cells=T) #Extract cnsample random cells from the first layer, exluding NAs
cells[,1]
prvals <- pr[cells[,1]] #Read those cells from all layers
qs <- quantile(prvals, probs=qprobs, na.rm=T, type=8, names=F) #Compute quantile
这种方法非常有效,因为所有层都具有相同位置的NA。我认为这应该是sampleRandom()
可以实现的选项。