r - 如何在 R 中删除并行任务中的临时文件
问题描述
是否可以从并行化的 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)
。但是,当并行运行任务时,这不再起作用。相反,该命令被简单地忽略,并且临时文件保持在原处,直到整个任务完成。
关于为什么会这样以及如何解决这个问题的任何想法?
解决方案
有一个功能removeTmpFiles
。
您应该能够使用,避免从插槽( )中f <- filename(subset)
读取。@
我不明白你为什么不能删除它。但也许它需要一些摆弄路径?
临时文件仅在光栅包认为有必要时创建,基于可用和需要的 RAM。见canProcessInMemory( , verbose=TRUE)
。默认设置有些保守,您可以使用rasterOptions()
(memfrac 和 maxmemory)更改它们
另一种方法是提供一个文件名参数来裁剪。然后你知道文件名是什么,你可以删除它。当然,您需要注意不要覆盖来自不同任务的数据,因此您可能需要使用一些与之关联的唯一 ID。
saveRDS( )
如果光栅由临时文件备份(因为它将消失),则将不起作用。
推荐阅读
- vue.js - 如何让管理员在 Vue 应用程序中编辑一些文本?
- algorithm - LinkedList 有什么区别?
- sql-server - 如何在一个数据库中实现 Azure SQL 服务器的实时报告?
- java - 从 SVG 图像导入的矢量图像在 ImageView 中无法识别
- html - 如何在不包含跨度标签的情况下“文本中心”
- git - 带有 docker-compose build 的 Git 子模块
- javascript - 如何使用 Chart.js 有条件地显示/隐藏 yAxis 上的网格线?
- ansible - Ansible-使用不同的配置部署多个虚拟机
- javascript - react-native : TypeError:undefined is not an object (评估 'this.state')
- python - Python 将两个变量语句合二为一,用于 numpy 函数