【问题标题】:Spatial data and memory空间数据和内存
【发布时间】:2016-08-23 20:02:46
【问题描述】:

我正在尝试添加 geotiff,但遇到了内存问题。根据以下 R 错误,R 正在使用所有 32GB...

In writeValues(y, x, start = 1) :
  Reached total allocation of 32710Mb: see help(memory.size)

我还检查了 R 的属性,它是 64 位的,目标是...

“C:\Program Files\R\R-3.3.0\bin\x64\Rgui.exe”

版本是

R.Version() 
$platform
[1] "x86_64-w64-mingw32"

$arch
[1] "x86_64"

$os
[1] "mingw32"

$system
[1] "x86_64, mingw32"

$status
[1] ""

$major
[1] "3"

$minor
[1] "3.0"

$year
[1] "2016"

$month
[1] "05"

$day
[1] "03"

$`svn rev`
[1] "70573"

$language
[1] "R"

$version.string
[1] "R version 3.3.0 (2016-05-03)"

$nickname
[1] "Supposedly Educational"

所以看起来我的最大内存正在被 R 使用。我尝试在 R 中使用 bigmemory 包。所以在下面的代码中,我尝试将矩阵更改为 big.matrix 但失败并且在尝试写入输出文件。对于尝试更改代码以减少内存使用或尝试在包 ff 或 bigmemory 中工作的任何建议?

############  LOOP THROUGH AGE MAPS TO COMPILE THE NUMBER OF TIMES A CELL BURNS DURING A GIVEN SPAN OF TIME  ####################
## Empirical Fires
print("1 of 3: 2010-2015")

burn.mat<- matrix(0,nrow,ncol) #create matrix of all zero's, the dimension of your landscape  (row, col)

# Read in Historical Fire maps
for (j in 2010:2015){ #Year Loop

  age.tmp<- as.matrix(raster(paste('fr',j,'.tif',sep=''))) #read in Age Map

  burn.mat<- burn.mat+(age.tmp==1) #when something has burned in ALFRESCO empirical fire history files, AGE=1. (age.tmp==0) is a 'logic' cmd, returning a 0,1 map for True/False

  #Write the data to a geotiff
  out <- raster(burn.mat,xmn=-1692148,xmx= 1321752, ymn = 490809.9, ymx = 2245610, crs = '+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs')
  writeRaster(out,filename=paste(outdir,'/burn.mat.hist.1950-2007.tif',sep=''),format = 'GTiff',options='COMPRESS=LZW',datatype='FLT4S',overwrite=T)
}

【问题讨论】:

  • 为什么代码每次循环都写入同一个文件名?

标签: r memory geospatial bigdata


【解决方案1】:

如果您使用 Raster* 对象而不是矩阵,问题可能会消失。类似的东西

library(raster)
r <- raster('fr2010.tif')

burn.mat <- setValues(r, 0)

for (j in 2010:2015) {
  age.tmp <- raster(paste0('fr', j, '.tif'))
  burn.mat <- burn.mat + (age.tmp==1) 
 # if age.tmp only has values of 0 and 1 use this instead:  
 # burn.mat <- burn.mat + age.tmp 
}

# write the results outside of the loop
writeRaster(burn.mat, filename=file.path(outdir, 'burn.mat.hist.1950-2007.tif'), options='COMPRESS=LZW',datatype='FLT4S',overwrite=TRUE)

没有循环的更直接的方法

 files <- paste0('fr', 2010:2015, '.tif'))
 s <- stack(files)
 burn <- sum(s)

或者

 burn <- sum(s == 1)

或者一步写入文件

 b <- calc(s, sum, filename=file.path(outdir, 'burn.mat.hist.1950-2007.tif'), options='COMPRESS=LZW', datatype='FLT4S', overwrite=TRUE)

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 2020-05-21
    • 2010-12-05
    • 1970-01-01
    • 2012-03-02
    • 2019-09-14
    • 2013-09-11
    • 2014-06-10
    • 2012-02-03
    相关资源
    最近更新 更多