【问题标题】:"Failure during raster IO" possibly related to raster size?“光栅 IO 期间失败”可能与光栅大小有关?
【发布时间】:2020-09-16 06:58:43
【问题描述】:

我在 R 中使用了非常大的栅格。我有一个以前能够运行的代码,具有相同的大栅格,但是当我尝试再次运行我的代码以获得可重复性时,我得到了同样的错误“光栅 IO 期间失败”。

例如,在这部分代码中,我试图将大型栅格(约 5 GB)分解成更小的图块,以便在 R 中加快处理时间。

large_raster <- stack("D:/large_raster.tif")
tileno <- 2 # split the large raster into 2 tiles

cl <- makeCluster(3)
registerDoSNOW(cl)
foreach(i = 1:nlayers(large_raster))%dopar%{
  library(raster)
  library(SpaDES)
  removeTmpFiles(h=0)
  newraster <- splitRaster(large_raster[[i]],nx=tileno,ny=1)
  for(j in 1:length(newraster)){
    if(i<10){
      writeRaster(newraster[[j]], filename=paste("D:/large_raster_layer0", i, "_tile", j, ".tif",sep=""))
    }else{
      writeRaster(newraster[[j]],filename=paste("D:/large_raster_layer", i, "_tile", j, ".tif",sep = ""))
    }
  }  
}
stopCluster(cl)

#stack tiles
dir <- ("D:/")
for(j in 1:tileno){
  tiles<-list.files(dir,pattern=paste("tile",j,sep=""))
  for(i in 1:length(tiles)){
    r<-raster(paste(dir,tiles[i],sep=""))
    if(i==1){s<-stack(r)
    }else{s<-stack(s,r)}
  }
  writeRaster(s, filename = paste("D:/large_raster_tile", j, ".tif", sep=""))
}

但我得到了错误

Error in rgdal::getRasterData(object@file@con, offset = offs, region.dim = reg,  : 
  Failure during raster IO

如果我跳过平铺步骤并最终使用我的 5 GB large_raster 我最终在此代码中再次收到错误,我正在创建一个名为 wfps_growSeas 的新栅格,方法是覆盖另外两个名为 @ 的栅格987654326@和swt

cl <- makeCluster(3)
registerDoSNOW(cl)

wfps_growSeas <- foreach(j = 1:nlayers(dswe2wfps))%dopar%{
  library(raster)
  overlay(dswe2wfps[[j]],swt[[j]], fun=function (x,y){
    x[y[]<=5]<-0
    return (x)},filename=paste("D:/temp2delete/raster",j, "_", info, ".tif",sep=""),overwrite=TRUE)
}  
stopCluster(cl)

wfps_growSeas <- stack(wfps_growSeas)

我得到了错误:

Error in { : task 1 failed - "Failure during raster IO

奇怪的是,这些错误是最近发生的。几周前,我能够使用这些完全相同的大栅格来运行这个确切的代码,而目前,我能够使用更小的栅格来运行这些编码。我正在使用 R-3.6.2,但同事建议此错误通常与纯粹的光栅大小和 R 的内存有关。 This post 表明此错误是由于栅格损坏造成的,但我认为这不是问题所在。有什么建议吗?

【问题讨论】:

    标签: r memory spatial raster r-raster


    【解决方案1】:

    可能是因为您的磁盘空间不足,主要是在临时文件夹中。清理临时文件夹和/或将其设置到其他位置。见?rasterOptions

    【讨论】:

    • 感谢您的回复!我的临时文件夹很干净,我还尝试在我的代码中添加类似 options(rasterTmpDir = "C:/rtmp") 之类的东西,这在我遇到内存问题之前已经有效,但我仍然遇到同样的错误。还有其他建议吗?
    • 实际上,我现在通过将所有文件夹从 D 驱动器(外部 2 TB 固态硬盘驱动器)更改为我的 C 驱动器来让它工作。这很奇怪,因为我可以使用较小的光栅尺寸将代码运行到 D 盘,而且我的外置硬盘还有足够的内存。
    【解决方案2】:

    通过将我的文件夹(以及保存在文件夹中的栅格)从 D 驱动器(外部 2 TB 固态硬盘驱动器)更改为我计算机的 C 驱动器,解决了这个问题。 我仍然可以直接在我的 D 驱动器上运行使用较小光栅尺寸的代码(在这种情况下,实际上仍然有足够的内存留在它上面)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2020-03-27
      • 2023-03-17
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多