R 的栅格函数返回新栅格是否在磁盘上工作?

Do R's raster functions returning new rasters work on-disk?

R 的栅格功能为磁盘上的内存映射栅格提供了一个方便的句柄,允许处理非常大的数据集。 aggregate 函数和包中的其他函数采用输入栅格并创建分辨率较小的新栅格。 新返回的栅格是否存在于内存中,或者是使用新的内存映射创建的磁盘临时副本?

我相信新创建的对象存储在磁盘上的临时副本中,但它们可以 "forced" 使用 raster::readALL 进入内存。

这取决于光栅大小和计算机可用的 RAM 量。小数据集保存在内存中,大数据集保存在磁盘上。

使用 canProcessInMemory、"rasterOptions"、maxmemorymemfrac

来决定 x 是小还是大
library(raster)
x <- raster(res=1/12)
values(x) <- 1

rasterOptions()
#maxmemory     : 1e+09 
#memfrac       : 0.6 

canProcessInMemory(x, verbose=TRUE) 
#memory stats in GB
#mem available: 50.07
#        60%  : 30.04
#mem needed   : 0.28
#max allowed  : 0.93  (if available)

#[1] TRUE

在上面的示例中,有 50 GB 的 RAM 可用。可以使用的最大分数是可用 RAM (0.6*50=30 GB) 或 maxmemoy 的 0.6 倍,以较小者为准。 maxmemory是以字节表示的,所以就是1e+09 / 1073741824 = 0.93 GB

为了避免将数据写入磁盘(这会减慢速度),您可以将 maxmemory 设置为更大的数字,甚至 Inf.

rasterOptions(maxmemory=Inf)

maxmemory 的默认值将在未来的版本中增加。

在2.8版本(目前正在开发中)中有第三个标准。如果 Raster* 的像元数大于(2^31 - 1;R 中的最大整数),则 canProcessInMemory returns FALSE

要确定 Raster* 对象 x 是否使用文件,您可以

filename(x)
#[1] ""

如果returns是一个空字符串,则没有文件。您可以使用 todisk 选项强制写入文件(仅用于测试目的)

y <- x * 1
filename(y)
#[1] ""

rasterOptions(todisk=TRUE)
y <- x * 1
filename(y)
#"/temp/RtmpQN2nYn/raster/r_tmp_2019-01-27_120723_22156_26708.grd"

如果你想要一个文件,最好使用大多数方法都有的 filename 参数。

会话结束时会删除临时文件(除非您使用 rasterOptions 将临时文件夹设置到其他位置(不推荐))