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