如何在R中的并行任务中删除临时文件
Posted
技术标签:
【中文标题】如何在R中的并行任务中删除临时文件【英文标题】:How to delete temporary files in parallel task in R 【发布时间】:2021-03-14 17:43:39 【问题描述】:是否可以从并行化的 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)
每次调用时都会创建一个小的临时文件。这似乎是 raster 包的标准行为,但它成为一个问题,因为这些临时文件仅在整个代码执行后才被删除,同时占用太多磁盘空间(数百 GB)。
在任务的串行执行中,我可以简单地使用file.remove(subset@file@name)
删除临时文件。但是,当并行运行任务时,这不再起作用。相反,该命令被简单地忽略,并且临时文件保持在原处,直到整个任务完成。
关于为什么会出现这种情况以及如何解决这个问题的任何想法?
【问题讨论】:
不幸的是,raster
包在大型数据集上表现不佳。几年前,我遇到了与您类似的问题,raster
将 2 TB 的临时文件写入磁盘。玩弄rasterOptions
并没有带来任何显着的改进。当时的一个解决方案是使用raster
的Python 对应物,结果证明效率更高。但是,raster
包现在有一个继任者。它被称为terra
,在更大的数据集上效果更好。你试过用那个吗?
@Chr 不,我没有,但我会看看!谢谢!
【参考方案1】:
这个removeTmpFiles
有一个函数。
您应该能够使用f <- filename(subset)
,避免从插槽读取(@
)。我不明白你为什么不能删除它。但也许它需要摆弄一下路径?
只有在光栅包认为有必要时才会创建临时文件,具体取决于可用和需要的 RAM。见canProcessInMemory( , verbose=TRUE)
。默认设置有些保守,您可以使用rasterOptions()
(memfrac 和 maxmemory)进行更改
另一种方法是为裁剪提供文件名参数。然后你知道文件名是什么,你可以删除它。当然,您需要注意不要覆盖来自不同任务的数据,因此您可能需要使用一些与之关联的唯一 ID。
如果光栅由临时文件备份,saveRDS( )
将不起作用(因为它将消失)。
【讨论】:
以上是关于如何在R中的并行任务中删除临时文件的主要内容,如果未能解决你的问题,请参考以下文章