我最近偶然发现了两个rasterOptions
可能会改善R:chunksize
和maxmemory
中栅格操作的性能。
然而,我很困惑,区别在于什么。帮助页面说明:
CHUNKSIZE: 处理(块状块)基于磁盘的Raster *对象时在单个块中读/写的最大单元数。
maxmemory:要读入内存的最大单元格数。即,如果Raster *对象的单元格数超过此数量,则canProcessInMemory将返回FALSE。
根据我的理解,它们都是相同的,至少我不能通过定义弄清楚它们之间的区别以及它们如何相互影响。即低chunksize结合高maxmemory值?
答案 0 :(得分:5)
这些选项是栅格包中的辅助程序,除非您编写用户定义的栅格写入功能,否则通常不需要调用它们。
如果您的栅格无法读入R,即,如果canProcessInMemory
返回FALSE,则需要按块读取块中的栅格。如果这样做,则提供块的大小,由完整行的整数值确定,每次读取一个(或并行)。
您应该在一个块中读取多少行? blockSize()
可帮助您确定此问题。
r <- raster(system.file("external/test.grd", package="raster"))
blockSize(r)
与writeValues()
结合使用,您可以手动将块中的栅格对象块的值写入类RasterBrick
的对象(更快)或类RasterLayer
的对象,这更灵活。
默认值最多读取1e8个单元格,这会导致不同的内存分配,具体取决于栅格单元格的位数。如果你有大量的内存,你可以通过增加最大内存量来获得不错的性能提升,同时增加内存的回报。
增加块大小并不是那么有价值,因为性能越来越低,块大小越来越大。通过增加块大小可以获得一些性能提升,但它并不重要。
虽然增加块大小有微小的好处,但增加最大内存大小这样做可能是一个坏主意,因为你在一次计算中强制整个栅格进入内存,这可能会触发{ {1}}失败,这将停止处理栅格,关闭连接,并吐出一些临时文件。
一个好的经验法则是减少块的大小以避免任何问题(达到极限 - 可能是1e5,你可能不会遇到任何问题)并牺牲一点性能,但要尽可能多地增加最大内存(1e9左右,具体取决于你的装备有多少RAM)。
最后,有一个nice vignette关于为光栅对象编写自定义函数,这些函数太大而无法放入内存中。