Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中矩阵和光栅的相对计算负担_R_R Raster - Fatal编程技术网

R中矩阵和光栅的相对计算负担

R中矩阵和光栅的相对计算负担,r,r-raster,R,R Raster,我惊讶地发现,我用一个大光栅创建的矩阵据称占用的内存是父矩阵的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"

我惊讶地发现,我用一个大光栅创建的矩阵据称占用的内存是父矩阵的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)
肯定低估了它的价值,因为12128字节不足以包含53m的值,即使考虑因素,尤其是87%(46m)是唯一值(根据
长度(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
对象的需要。浏览一下
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)

fb4我不确定
object.size
是否有
S4
方法。一个比我所知道的更具知识(和智慧:-())的人。不,这是因为该对象的海量数据由光栅保存在文件中听起来你是对的。这也是R不能使用
save()保存光栅的原因吗
?遗憾的是,文档中没有关于此限制的明显细节。@geotheory取决于您看的位置:尝试
光栅::stackSave
writeRaster
,以及其他光栅文件收发工具。我知道writeRaster,但它在存储或读入方面似乎效率较低。将尝试stackSave