gpt4 book ai didi

减少大栅格列表上马赛克的内存使用量

转载 作者:行者123 更新时间:2023-12-02 08:08:30 26 4
gpt4 key购买 nike

我正在使用 mosaic raster 中的函数使用@RobertH 建议的方法组合一长串(11,000 个文件)栅格列表的包 here .

rlist <- sapply(list_names)
rlist$fun <- mean
rlist$na.rm <- TRUE
x <- do.call(mosaic, rlist)

正如您可能想象的那样,这最终会超出我的可用内存(在几台不同的机器和计算集群上)。我的问题是:有没有办法减少 mosaic 的内存使用量?或 do.call ?我试过改变 maxmemoryrasterOptions() ,但这似乎没有帮助。以较小的批次处理栅格似乎有问题,因为栅格可能在空间上是分离的(即,顺序栅格文件可能彼此相距很远)。在此先感谢您提供的任何帮助。

最佳答案

与其一次将所有栅格加载到内存中(在 mosaic() 调用中),您能否一次处理一个?这样,每次将更多栅格放入内存时,您的马赛克就会更新,但随后您可以摆脱新栅格,只保留不断更新的马赛克栅格。

假设您的 rlist object 是一个栅格列表,我在想这样的事情:

伪代码

  • 初始化 updating_raster对象作为列表中的第一个栅格
  • 依次循环遍历列表中的每个栅格,从第二个栅格开始
  • 将第 i 个栅格读入名为 next_raster 的内存中
  • 更新 updating_raster通过使用加权平均值
  • 用自身和下一个栅格的马赛克覆盖对象
    R代码

    使用 mosaic() 中的代码进行测试帮助文件示例...

    首先生成一些栅格并使用标准镶嵌方法。

    library(raster)

    r <- raster(ncol=100, nrow=100)
    r1 <- crop(r, extent(-10, 11, -10, 11))
    r2 <- crop(r, extent(0, 20, 0, 20))
    r3 <- crop(r, extent(9, 30, 9, 30))

    r1[] <- 1:ncell(r1)
    r2[] <- 1:ncell(r2)
    r3[] <- 1:ncell(r3)

    m1 <- mosaic(r1, r2, r3, fun=mean)

    将栅格放在一个列表中,使它们的格式与我认为的类似。
    rlist <- list(r1, r2, r3)

    因为 NA处理 weighted.mean()函数,我选择通过将求和和除法分解为不同的步骤来创建相同的效果......

    首先初始化求和栅格:
    updating_sum_raster <- rlist[[1]]

    然后初始化“计数器”光栅。这将表示在每个像素处进行镶嵌的栅格数量。它在所有不是 NA 的单元格中以 1 开头.它应该正确处理 NA s 这样它只会在非 NA 的情况下为给定像素增加值已添加到更新总和中。
    updating_counter_raster <- updating_sum_raster
    updating_counter_raster[!is.na(updating_counter_raster)] <- 1

    这是不需要所有栅格一次都在内存中的循环。添加到镶嵌的栅格的计数器栅格仅在不是 NA 的像元中的值为 1。 .通过对当前计数器光栅和更新计数器光栅求和来更新计数器。通过对当前栅格值和更新栅格值求和来更新总和。
    for (i in 2:length(rlist)) {

    next_sum_raster <- rlist[[i]]
    next_counter_raster <- next_sum_raster
    next_counter_raster[!is.na(next_counter_raster)] <- 1

    updating_sum_raster <- mosaic(x = updating_sum_raster, y = next_sum_raster, fun = sum)
    updating_counter_raster <- mosaic(updating_counter_raster, next_counter_raster, fun = sum)

    }

    m2 <- updating_sum_raster / updating_counter_raster

    这里的值似乎与 mosaic() 的使用相匹配功能
    identical(values(m1), values(m2))
    > TRUE

    但栅格本身并不相同:
    identical(m1, m2)
    > FALSE

    不完全确定为什么,但也许这会让你更接近?

    也许 compareRaster()是一种更好的检查方法:
    compareRaster(m1, m2)
    > TRUE

    万岁!

    这是一个阴谋!
    plot(m1)
    text(m1, digits = 2)
    plot(m2)
    text(m2, digits = 2)

    comparison between mosaic function and loop approach

    再挖一点杂草......

    来自 mosaic.R文件:

    它看起来像 mosaic()函数初始化一个名为 v 的矩阵用列表中所有栅格中所有单元格的值填充。矩阵中的行数 v是输出栅格中的像元数(基于完整镶嵌范围和分辨率),列数是在您的情况下要镶嵌的栅格数 (11,000)。也许您遇到了 R 中矩阵创建的限制?

    使用 1000 x 1000 光栅(1e6 像素), v NA的矩阵s 占用 41 GB。您希望最终的镶嵌栅格有多大?
    r <- raster(ncol=1e3, nrow=1e3)
    x <- 11000
    v <- matrix(NA, nrow=ncell(r), ncol=x)
    format(object.size(v), units = "GB")
    [1] "41 Gb"

    关于减少大栅格列表上马赛克的内存使用量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215026/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com