我最近偶然发现了两种可能的 rasterOptions ,它们可以提高 R 中光栅操作的性能: chunksizemaxmemory
然而,我很困惑有什么区别。帮助页面指出:

  • 块大小:
    在处理(逐块)基于磁盘的 Raster* 对象时,在单个块中读取/写入的最大单元数。
  • maxmemory: 要读入内存的最大单元数。即,如果 Raster* 对象的单元数超过此数量,则 canProcessInMemory 将返回 FALSE。

  • 在我的理解中,它们都是相同的,至少我无法通过定义弄清楚区别是什么以及它们如何相互影响。 IE。低块大小与高 maxmemory 值相结合?

    最佳答案

    这些选项是光栅包中的辅助程序,通常不需要调用,除非您正在编写用户定义的光栅写入函数。

    如果您的栅格无法读入 R,即在 canProcessInMemory 返回 FALSE 的情况下,您需要逐块读取栅格。如果你这样做,你提供了块的大小,由一个完整行的整数值决定,这些行将一次(或并行)读取一个。

    您应该在单个块中读取多少行? blockSize() 可帮助您确定这一点。

    r <- raster(system.file("external/test.grd", package="raster"))
    blockSize(r)
    

    结合 writeValues() ,您可以手动将栅格对象的值逐块写入速度更快的 RasterBrick 类对象或更灵活的 RasterLayer 类对象中。

    默认值最多读取 1e8 个像元,这会导致内存分配不同,具体取决于栅格像元的位数。如果您有大量的内存,您可以通过增加最大内存量来获得不错的性能提升,并增加拥有更多内存的返回。

    增加块大小并不是很有值(value),因为性能下降会导致更多的块大小。通过增加块大小,您将获得一些性能提升,但这并不重要。

    虽然增加块大小有边际 yield ,但同时增加最大内存大小可能是一个坏主意,因为您通过在单个计算中执行此操作来强制整个栅格进入内存,这可能会触发 canProcessInMemory 失败,这将停止光栅的处理,关闭连接,并吐出一些临时文件。

    一个好的经验法则是减少块的大小以避免任何问题(最多一个限制——也许是 1e5,你可能永远不会遇到任何问题)并牺牲一点性能,但要增加最大尽可能多的内存(1e9 左右,取决于您的装备有多少 RAM)。

    最后,还有一个关于为太大而无法放入内存的光栅对象编写自定义函数的 nice vignette

    关于rasterOptions : Difference between chunksize and maxmemory,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38368939/

    10-13 03:07