【问题标题】:Setting an overwriteable temporary file for rasters in R在 R 中为栅格设置可覆盖的临时文件
【发布时间】:2013-09-28 02:47:43
【问题描述】:

我正在使用R (3.0.1) 中的raster (2.1-49) 包来读取许多栅格,计算一些统计数据并存储结果。一些栅格太大而无法存储在内存中,因此作为临时文件写入与tempdir() 指示的文件夹不同的文件夹中。问题是,实际上我有超过 5000 个栅格,并且临时文件在脚本完成运行之前填满了我的硬盘驱动器。我想在循环的每次迭代中覆盖相同的临时文件。我的代码如下所示:

require(raster)
names<- seq(1:5000)
for (i in 1:5000)
{
 r <- raster(paste("rast_",names[i],".tif"),sep="")
 #Stats Code#
}

filename="C:/temp",overwrite=T 添加到raster 函数代码行不起作用。但是,这两个附加选项可与同一包中的 rasterize 函数一起使用...

有没有办法为raster 函数设置一个可以覆盖的临时文件?

非常感谢任何帮助。

【问题讨论】:

  • 您是否在每个循环结束时尝试过rm(r)(即在#Stats Code# 之后和} 之前。
  • 我刚刚尝试添加它,不幸的是,tempdir() 中仍在生成多个临时 .grd 文件。
  • 所以 tempdir() 对于整个 R 会话应该是相同的,所以 rm( tempdir() ) 可以代替。
  • 也许你可以用tempfile()创建一个临时文件名,然后在代码末尾用rm删除它?
  • @JPD -- 很高兴有帮助。我会回答,但我一般不喜欢将其作为解决方案,因为它会删除 all 临时文件,而不仅仅是您刚刚创建的文件。听起来这在您的情况下很好,并且很可能在所有其他情况下也是如此,但我仍然不明白 raster 将其所有临时文件写入磁盘的位置和时间,所以我不知道不知道removeTmpFiles(h=0) 可能会导致什么冲突。

标签: r loops raster temporary-files


【解决方案1】:

这个问题类似于this one。我在this discussion 上找到了一种更好的方法来管理这个问题,它从循环或并行进程中创建一个临时目录,该目录与循环中正在处理的数据的唯一名称相关联(在我的情况下, single@data$OWNER) 的值。

我正在使用并行循环,正如上面@Josh O'Brien 所说,我不想从一个公共临时目录中删除所有文件,因为它可能会删除其他进程的临时文件。这是我使用的代码:

#creates unique filepath for temp directory
dir.create (file.path("c:/",single@data$OWNER), showWarnings = FALSE)

#sets temp directory
rasterOptions(tmpdir=file.path("c:/",single@data$OWNER)) 

然后在此处插入处理代码,然后在循环结束时删除整个文件夹:

#removes entire temp directory without affecting other running processes
unlink(file.path("c:/",single@data$OWNER), recursive = TRUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2016-06-30
    相关资源
    最近更新 更多