R中矩阵和栅格的相对计算负担
Posted
技术标签:
【中文标题】R中矩阵和栅格的相对计算负担【英文标题】:Relative computational burdens of the matrix and raster in R 【发布时间】:2014-02-10 11:16:25 【问题描述】:我惊讶地发现,我从大型栅格创建的矩阵据称占用的内存是父矩阵的 35k 倍。此代码演示:
> # comparison with R's built-in volcano data
> object.size(volcano)
42656 bytes
> object.size(as.matrix(volcano))
42656 bytes
> # comparison with my data
> class(region_utm)
[1] "RasterLayer"
attr(,"package")
[1] "raster"
> dim(region_utm)
[1] 7297 7297 1
> object.size(region_utm)
12128 bytes
> region_mat = as.matrix(region_utm)
> dim(region_mat)
[1] 7297 7297
> object.size(region_mat)
425969872 bytes
object.size(region_utm)
肯定是低估了,因为 12,128 字节不足以包含 53m 值,即使考虑在内,特别是 87% (46m) 是唯一值(根据 length(unique(region_utm))
)。不知道如何获得真实的内存估计..
但是,绘制栅格比使用矩阵要快得多。但我一直认为矩阵大致相当于没有空间数据槽的栅格,但我一定错过了这些数据结构之间的一个重要区别。感谢您澄清什么可以解释这种记忆差异。我经常使用矩阵工作流,需要了解它们的局限性。
编辑:期待str()
报告的请求:
> str(region_mat)
num [1:7297, 1:7297] NA NA NA NA NA NA NA NA NA NA ...
> summary(as.vector(region_mat))
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-1.7 21.3 118.1 135.5 236.9 1020.0 1266438
> str(region_utm)
Formal class 'RasterLayer' [package "raster"] with 12 slots
..@ file :Formal class '.RasterFile' [package "raster"] with 13 slots
.. .. ..@ name : chr "/private/var/folders/kh/vlbqbp3n29lcvp491zbrnpl80000gn/T/R_raster_robinedwards/raster_tmp_2014-02-09_164243_1484_10601.grd"
.. .. ..@ datanotation: chr "FLT8S"
.. .. ..@ byteorder : Named chr "little"
.. .. .. ..- attr(*, "names")= chr "value"
.. .. ..@ nodatavalue : num -1.7e+308
.. .. ..@ NAchanged : logi FALSE
.. .. ..@ nbands : int 1
.. .. ..@ bandorder : Named chr "BIL"
.. .. .. ..- attr(*, "names")= chr "value"
.. .. ..@ offset : int 0
.. .. ..@ toptobottom : logi TRUE
.. .. ..@ blockrows : int 0
.. .. ..@ blockcols : int 0
.. .. ..@ driver : chr "raster"
.. .. ..@ open : logi FALSE
..@ data :Formal class '.SingleLayerData' [package "raster"] with 13 slots
.. .. ..@ values : logi(0)
.. .. ..@ offset : num 0
.. .. ..@ gain : num 1
.. .. ..@ inmemory : logi FALSE
.. .. ..@ fromdisk : logi TRUE
.. .. ..@ isfactor : logi FALSE
.. .. ..@ attributes: list()
.. .. ..@ haveminmax: logi TRUE
.. .. ..@ min : num -1.73
.. .. ..@ max : num 1020
.. .. ..@ band : int 1
.. .. ..@ unit : chr ""
.. .. ..@ names : chr "layer"
..@ legend :Formal class '.RasterLegend' [package "raster"] with 5 slots
.. .. ..@ type : chr(0)
.. .. ..@ values : logi(0)
.. .. ..@ color : logi(0)
.. .. ..@ names : logi(0)
.. .. ..@ colortable: logi(0)
..@ title : chr(0)
..@ extent :Formal class 'Extent' [package "raster"] with 4 slots
.. .. ..@ xmin: num 180386
.. .. ..@ xmax: num 394918
.. .. ..@ ymin: num 1879673
.. .. ..@ ymax: num 2103691
..@ rotated : logi FALSE
..@ rotation:Formal class '.Rotation' [package "raster"] with 2 slots
.. .. ..@ geotrans: num(0)
.. .. ..@ transfun:function ()
..@ ncols : int 7297
..@ nrows : int 7297
..@ crs :Formal class 'CRS' [package "sp"] with 1 slots
.. .. ..@ projargs: chr "+proj=utm +zone=16 ellps=WGS84 +ellps=WGS84"
..@ history : list()
..@ z : list()
【问题讨论】:
我不确定object.size
是否有S4
方法。某人的知识(和智慧 :-( )比我可能知道的要多。
不,是该对象的批量数据按栅格保存在文件中
【参考方案1】:
事实上,我几乎可以肯定object.size
不会对S4
对象执行您想要的操作。查看cgwtools::lssize
的代码。以下是我在其他 SO 贡献者的大力帮助下写的部分内容:
fb4 <- function(x)
if (isS4(x))
slots <- setNames(slotNames(x), slotNames(x))
lapply(lapply(slots, slot, object=x), fb4)
else object.size(if(is.list(x)) unlist(x) else x)
fb4(object)
sizes<-sapply(items,function(k) sum(unlist(s4gonebyte(get(k))) ),simplify=FALSE)
这是对 S4
插槽和子插槽的递归深入研究。
【讨论】:
听起来你是对的。这也是 R 不能使用save()
保存栅格的原因吗?遗憾的是,文档中没有关于此限制的明显细节。
我知道 writeRaster,但它在存储或读回时似乎效率较低。将尝试 stackSave以上是关于R中矩阵和栅格的相对计算负担的主要内容,如果未能解决你的问题,请参考以下文章
计算 R 中其他栅格列的景观度量(landscapemetrics 包)