rasterOptions:chunksize 和 maxmemory 之间的区别
rasterOptions: Difference between chunksize and maxmemory
我最近偶然发现了两个可能的 rasterOptions
,它们可以提高 R 中光栅操作的性能:chunksize
和 maxmemory
。
然而,我很困惑有什么区别。帮助页面指出:
块大小:
处理(逐块)基于磁盘的 Raster* 对象时,单个块中的最大单元数 read/write。
maxmemory: 读入内存的最大单元数。即,如果 Raster* 对象的单元格数量超过此数量,canProcessInMemory 将 return FALSE。
在我的理解中它们是相同的,至少我无法通过定义弄清楚它们之间的区别以及它们如何相互影响。 IE。低 chunksize 与高 maxmemory 值相结合?
这些选项是光栅包中的辅助程序,通常不需要调用,除非您正在编写用户定义的光栅写入函数。
如果您的栅格无法读入 R,即如果 canProcessInMemory
返回 FALSE,您需要逐块读取栅格。如果这样做,您将提供块的大小,由完整行的整数值确定,这些行将一次读取一个(或并行)。
您应该在一个块中读取多少行? blockSize()
帮助您确定这一点。
r <- raster(system.file("external/test.grd", package="raster"))
blockSize(r)
结合writeValues()
,可以手动将栅格对象的值逐块写入classRasterBrick
的对象,速度更快,或者classRasterLayer
,比较灵活。
默认值最多读取 1e8 个像元,这会导致根据栅格像元的位数分配不同的内存。如果您有大量内存,则可以通过增加最大内存量来获得不错的性能提升,增加 returns 以获得更多内存。
增加区块大小并没有太大价值,因为随着区块大小的增加,性能会下降 returns。您将通过增加块大小获得一些性能提升,但这并不重要。
虽然增加块大小有边际收益,但同时增加最大内存大小可能不是一个好主意,因为您通过在一次计算中执行此操作将整个栅格强制进入内存,这可能触发 canProcessInMemory
失败,这将停止光栅处理,关闭连接,并吐出一些临时文件。
一个好的经验法则是减小块的大小只是为了避免任何问题(最大限制——可能是 1e5,你可能永远不会 运行 遇到任何问题)并牺牲一个一点性能,但尽可能增加最大内存(1e9 左右,取决于您的设备有多少 RAM)。
最后,还有一个 nice vignette 关于为太大而无法放入内存的栅格对象编写自定义函数。
我最近偶然发现了两个可能的 rasterOptions
,它们可以提高 R 中光栅操作的性能:chunksize
和 maxmemory
。
然而,我很困惑有什么区别。帮助页面指出:
块大小: 处理(逐块)基于磁盘的 Raster* 对象时,单个块中的最大单元数 read/write。
maxmemory: 读入内存的最大单元数。即,如果 Raster* 对象的单元格数量超过此数量,canProcessInMemory 将 return FALSE。
在我的理解中它们是相同的,至少我无法通过定义弄清楚它们之间的区别以及它们如何相互影响。 IE。低 chunksize 与高 maxmemory 值相结合?
这些选项是光栅包中的辅助程序,通常不需要调用,除非您正在编写用户定义的光栅写入函数。
如果您的栅格无法读入 R,即如果 canProcessInMemory
返回 FALSE,您需要逐块读取栅格。如果这样做,您将提供块的大小,由完整行的整数值确定,这些行将一次读取一个(或并行)。
您应该在一个块中读取多少行? blockSize()
帮助您确定这一点。
r <- raster(system.file("external/test.grd", package="raster"))
blockSize(r)
结合writeValues()
,可以手动将栅格对象的值逐块写入classRasterBrick
的对象,速度更快,或者classRasterLayer
,比较灵活。
默认值最多读取 1e8 个像元,这会导致根据栅格像元的位数分配不同的内存。如果您有大量内存,则可以通过增加最大内存量来获得不错的性能提升,增加 returns 以获得更多内存。
增加区块大小并没有太大价值,因为随着区块大小的增加,性能会下降 returns。您将通过增加块大小获得一些性能提升,但这并不重要。
虽然增加块大小有边际收益,但同时增加最大内存大小可能不是一个好主意,因为您通过在一次计算中执行此操作将整个栅格强制进入内存,这可能触发 canProcessInMemory
失败,这将停止光栅处理,关闭连接,并吐出一些临时文件。
一个好的经验法则是减小块的大小只是为了避免任何问题(最大限制——可能是 1e5,你可能永远不会 运行 遇到任何问题)并牺牲一个一点性能,但尽可能增加最大内存(1e9 左右,取决于您的设备有多少 RAM)。
最后,还有一个 nice vignette 关于为太大而无法放入内存的栅格对象编写自定义函数。