r - 如何在R中的并行任务中删除临时文件

标签 r r-raster parallel-foreach

是否可以从并行化的 R 任务中删除临时文件?
我依靠 R 中的 doParallel 和 foreach 并行化对巨大光栅文件的小子集执行各种计算。这涉及多次裁剪大型栅格的子集。我的基本语法类似于:

grid <- raster::raster("grid.tif")
data <- raster::raster("data.tif")

cl <- parallel::makeCluster(32)
doParallel::registerDoParallel(cl)

m <- foreach(col=ncol(grid)) %:% foreach(row=nrow(grid)) %dopar% {
   
   # get extent of subset 
   cell <- raster::cellFromRowCol(grid, row, col)
   ext <- raster::extentFromCells(grid, cell)
   
   # crop main raster to subset extent
   subset <- raster::crop(data, ext)
   
   # ...
   # perform some processing steps on the raster subset
   # ...
   
   # save results to a separate file
   saveRDS(subset, paste0("output_folder/", row, "_", col)
}
该算法运行良好并达到了我想要的效果。然而,raster::crop(data, ext)每次调用时都会创建一个小的临时文件。这似乎是光栅包的标准行为,但它成为一个问题,因为这些临时文件仅在整个代码执行后才被删除,同时占用太多磁盘空间(数百 GB)。
在任务的串行执行中,我可以简单地使用 file.remove(subset@file@name) 删除临时文件。 .但是,当并行运行任务时,这不再起作用。相反,该命令会被简单地忽略,并且临时文件会保持原样,直到整个任务完成。
关于为什么会这样以及我如何解决这个问题的任何想法?

最佳答案

有此功能 removeTmpFiles .
您应该可以使用 f <- filename(subset) , 避免从插槽 ( @ ) 中读取。我不明白为什么你不能删除它。但也许它需要摆弄路径?
临时文件仅在光栅包认为有必要时创建,基于可用和所需的 RAM。见 canProcessInMemory( , verbose=TRUE) .默认设置有些保守,您可以使用 rasterOptions() 更改它们。 (memfrac 和 maxmemory)
另一种方法是为crop 提供一个文件名参数。然后你知道文件名是什么,你可以删除它。当然,您需要注意不要覆盖来自不同任务的数据,因此您可能需要使用一些与之关联的唯一 id。saveRDS( )如果光栅由临时文件备份(因为它会消失),则将不起作用。

关于r - 如何在R中的并行任务中删除临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65113610/

相关文章:

r - 在 R 中绘制 lme 模型(带有多项式)的预测值

r - r 中的 xgb.plot.tree 布局

r - 如何将栅格保存在包中

r - 如何有效地将所有光栅文件导入 R?

R并行: rbind parallely into separate data.帧

r - 在 R foreach() 下并行运行时无法识别动态库依赖项

R - end1 == start2 的连续情况序列

r - 包 igraph0 已弃用,因此无法访问 gspan 包

r - 将列并行分配给 data.table