R光栅乘法 - 为啥光栅大小会大大增加
Posted
技术标签:
【中文标题】R光栅乘法 - 为啥光栅大小会大大增加【英文标题】:R raster multiplication - why does the raster size increase tremendouslyR光栅乘法 - 为什么光栅大小会大大增加 【发布时间】:2018-06-15 19:59:14 【问题描述】:我正在使用 R(光栅包)中的 MODIS 光栅数据,我想知道,为什么将两个光栅文件相乘时光栅的大小会变大 7000 倍。在我的例子中,一个栅格是一个简单的 MODIS 栅格(值在 0 和 255(整数)之间),另一个是一种模板(0 和 1(整数))。所以我不明白为什么光栅应该这么大?尝试使用 writeRaster 保存栅格时这是一个大问题,因为我的 R 会话不断崩溃。
我的代码如下所示:
a <- list.files('All_MODIS_files_of_one_year.tif')
for (day in 1:length(a))
ra <- raster(a[day])
ra_reduce <- ra * s
ra
的对象大小为 12064 字节,s
的对象大小为 11984 字节。 ra_reduce
的对象大小为 93777512 字节。当我最终堆叠一整年时,文件变得几乎 40 GB 大。 :(
我尝试了round
函数,尝试将@file@datanotation
设置为整数,但没有任何帮助。
有谁知道如何解决这个问题?!
【问题讨论】:
【参考方案1】:ra
(可能还有s
)的对象大小非常小,因为它在内存中没有单元格值。如果您show(ra)
,您将看到数据在磁盘上(在文件中)。乘法后,值将在内存中。您可以通过使用calc
或overlay
等允许您将结果写入文件的方法或使用writeRaster
来避免这种情况。那就是:
x <- overlay(ra, s, fun=function(x,y)x*y, filename='file.tif')
或者
ra_reduce <- ra * s
ra_reduce <- writeRaster(ra_reduce, filename='ra_reduce.tif')
要减小文件大小,您可以(也许)使用datatype
参数。
【讨论】:
谢谢!我决定将每个文件写入磁盘(作为压缩 = 9 的 .nc),然后将它们合并。它起作用了,现在我知道是什么导致了这个问题;)谢谢!【参考方案2】:光栅的大小取决于您保存的格式。当您使用写入栅格函数时,您必须指定输出的数据类型。如果我没记错的话,默认情况下它会将其保存为浮点数,这意味着巨大的光栅尺寸。例如,如果数字显示为“0.000000”,您可以检查栅格是否为浮点数。
所以,要纠正这个问题,你应该这样做:
a <- list.files('All_MODIS_files_of_one_year.tif')
for (day in a) #some optimization here, hope you don't mind
ra <- raster(day) #if you don't use length, the position of 'day' will be the name of the raster.
ra_reduce <- ra * s
writeRaster(ra_reduce, paste0("prefix_", day,".tif"), format = "GTiff", datatype = "INT1U", overwrite = TRUE)
基本上,要纠正此问题,您只需指定要保存栅格的数据类型。这是writeRaster
函数的参数之一。我指定的那个是我知道的这个函数的最小数据类型。值将是整数,可以在 0 到 256 之间变化。您可以查看其他数据类型文档。
【讨论】:
以上是关于R光栅乘法 - 为啥光栅大小会大大增加的主要内容,如果未能解决你的问题,请参考以下文章