控制内存中的terra SpatRaster大小

qojgxg4l  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(117)

这里我创建了一个简单的光栅,只包含整数“1”。

r <- rast(matrix(rep(1, 100), nrow = 10))

此对象没有关联的数据类型:

datatype(r.in.flt)
# ""

我使用datatype = "FLT4S"将其写入磁盘,然后将其读回。

name.flt <- "test_FLT4S.tif"
writeRaster(r, name.flt, datatype = "FLT4S")
r.in.flt <- rast(name.flt)

我还使用datatype = "INT1U"将其写入磁盘,然后再将其读回。

name.int <- "test_INT1U.tif"
writeRaster(r, name.int, datatype = "INT1U")
r.in.int <- rast(name.int)

传入的数据包显示正确:

datatype(r.in.flt)
# "FLT4S"
datatype(r.in.int)
# "INT1U"

相应的文件大小显示了整数数据类型的大小的正确减少:

file.size(name.flt)
# 665
file.size(name.int)
# 618

但在内存中,这两个对象似乎具有相同的大小:

object.size(r.in.flt)
# 1304 bytes
object.size(r.in.int)
# 1304 bytes

问题:

1.为什么原始SpatRaster r没有关联的数据类型?
1.是否可以设置SpatRaster r的数据类型?我想这样做是为了确保我正在使用的SpatRaster被保存为整数数据类型,以便在处理大型数据集时占用最少的内存。
1.为什么从“INT1U”文件读入的对象在R中不会消耗更少的内存

goqiplq2

goqiplq21#

数据类型仅与光栅文件相关。对象本身没有一个。RAM中的栅格值始终为数值(双精度;但是注意像as.data.frameextract这样的方法返回的类型是在磁盘上的。
有关RAM要求,请参见terra::mem_info
terra的主要设计原则是,您不必将所有值读入内存。如果有必要,数据会自动以较小的块进行处理。可能有例外,我不知道你的应用程序,所以我不能肯定,但你可能是不必要的复杂化的事情。

相关问题