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),您将看到数据在磁盘上(在文件中)。乘法后,值将在内存中。您可以通过使用calcoverlay 等允许您将结果写入文件的方法或使用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光栅乘法 - 为啥光栅大小会大大增加的主要内容,如果未能解决你的问题,请参考以下文章

为啥光栅文件大小与对象大小有很大不同?

如何在 R 中控制光栅文件的大小

为啥保守光栅化无法为某些三角形调用片段着色器?

使用 rasterio 屏蔽/裁剪光栅会导致 AttributeError

什么是AWG(阵列波导光栅)及AWG的基本结构

当我尝试增加矩阵大小时,在 AMD openCL/C 中实现矩阵向量乘法会导致系统死机