我正在使用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
设置为整数,但没有任何帮助。
有谁知道如何解决这个问题?!
答案 0 :(得分: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
参数。
答案 1 :(得分:0)
栅格的大小取决于您保存它们的格式。使用写栅格功能时,必须指定输出的数据类型。如果我没记错的话,默认情况下会将其保存为浮点数,这意味着巨大的栅格大小。例如,如果数字显示为“ 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。您可以查看其他数据类型的文档。