非常慢的栅格:: sampleRandom,我可以做什么作为解决方法?

时间:2014-11-28 10:38:13

标签: r raster r-raster

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值)。文件是:

  1. 1.4GB,1个变量,filesystem 1
  2. 2.7GB,2个变量,对于我读过的变量,文件系统2
  3. 大约1.35GB
  4. 2.7GB,2个变量,对于我读过的变量,文件系统2
  5. 大约1.35GB
  6. 2.7GB,2个变量,对于我读过的变量,文件系统2
  7. 大约1.35GB
  8. 1.2GB,1个变量,filesystem 3
  9. 1.2GB,1个变量,filesystem 3
  10. 请注意:

    1. 文件位于三个不同的nfs文件系统上,其性能我不确定。我不能排除这样一个事实,即nfs文件系统的性能可以从一个时刻到另一个时刻发生很大的变化。
    2. 脚本运行时,RAM使用率始终为100%,但系统不会全部使用它。
    3. sampleRandom(dataset, N)从一个层(=一个一步)获取N个非NA随机单元格,并读取其内容。对于每个图层,对于相同的N个单元格是这样的。如果将数据集可视化为3D矩阵,以Z作为时间步长,则该函数采用N个随机非NA列。但是,我想函数知道所有层都具有相同位置的NA,因此必须检查它选择的任何列中是否没有NA。
    4. 在具有8393个单元格(总共大约340MB)的文件上使用相同的命令并读取所有单元格时,计算时间只是尝试从具有30k单元格的文件中读取1000个单元格的一小部分。
    5. 产生以下输出的完整脚本是here,带有注释等。


      如果我尝试阅读所有30k cells

      1. cannot allocate vector of size 2.6 Gb
      2. 如果我看了1000 cells

        1. 5分钟
        2. 45米
        3. 30 m
        4. 30 m
        5. 20米
        6. 20米
        7. 如果我看了3000 cells

          1. 15分钟
          2. 18米
          3. 35米
          4. 34 m
          5. 60米
          6. 60米
          7. 如果我尝试阅读5000 cells

            1. 2.5小时
            2. 22 h
            3. for&gt; 2我必须在18小时后停止,我不得不使用工作站执行其他任务

            4. 通过更多测试,我能够发现它是sampleRandom()函数占用大部分计算时间,而不是计算分位数(其中我可以加快使用其他分位数函数,例如kuantile())。

              1. 为什么sampleRandom()花了这么长时间?为什么它表现得如此奇怪,有时很快,有时甚至很慢?
              2. 最佳解决方法是什么?我想我可以为第一层手动生成N个随机单元格,然后为所有时间步长手动生成raster::extract
              3. 编辑: 工作方法是:

                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()可以实现的选项。

0 个答案:

没有答案