R 为什么有些光栅函数在指定的临时目录中写入临时文件,而有些则不写入?

R 为什么有些光栅函数在指定的临时目录中写入临时文件,而有些则不写入?,r,raster,temporary-files,R,Raster,Temporary Files,我想控制光栅函数生成的临时文件的存储位置。原因是我希望能够删除特定于某个进程的临时文件,而无需删除并行运行的其他进程中使用的临时文件。这是卢克·麦考利提出的 其思想是,每个进程都具有以下命令:设置特定于进程的tmpdir,然后运行一些光栅函数,将其特定于进程的输出存储在tmpdir()以外的其他位置,最后删除特定于进程的tmpdir() 但是一些光栅操作会将其临时文件保存在“默认”临时目录中(看起来像C:\Users\…\temp\RtmpaevgEe)。因此,这些临时文件无法在每个进程结束时删

我想控制光栅函数生成的临时文件的存储位置。原因是我希望能够删除特定于某个进程的临时文件,而无需删除并行运行的其他进程中使用的临时文件。这是卢克·麦考利提出的

其思想是,每个进程都具有以下命令:设置特定于进程的
tmpdir
,然后运行一些光栅函数,将其特定于进程的输出存储在
tmpdir()
以外的其他位置,最后删除特定于进程的
tmpdir()

但是一些光栅操作会将其临时文件保存在“默认”临时目录中(看起来像
C:\Users\…\temp\RtmpaevgEe
)。因此,这些临时文件无法在每个进程结束时删除,最终可能会填满硬盘。 无论是针对单个流程执行,还是在流程的迭代循环或并行设置中执行,都会发生这种情况

设置进程特定临时目录的代码是:

# Define which process we are in:
  processname <- file.path(<raster_to_input_to_this_process.tif>)
# Create path to process-specific temp directory
  process_tmp_dir <- file.path(paste0(processname,"_Tmp"))
# Create process-specific temp directory
  dir.create(process_tmp_dir, showWarnings = FALSE)
# set temp directory
  rasterOptions(tmpdir=process_tmp_dir)
我想知道为什么这些功能不“符合”新的tmpdir设置,而
mask
符合。 (另外,请注意,
mask
生成的.grd文件比由
calc
等生成的.tif文件重得多。) 我将非常感谢您提出的任何建议,以及如何确保在指定的
tmpDir()
中生成任何光栅函数的临时文件


如果您认为这对于更好地理解正在发生的事情是必要的,我可以提供数据并明确精确的光栅操作

我想不出是什么原因导致了这种情况。因此,这并不能直接回答您的问题,但它确实提出了一条替代路径

我会在每个步骤中使用
filename
参数,并使用进程id分配唯一的文件名;或者我会存储临时文件名(如果文件很小,可能是“”),然后在处理完这些文件后删除它们。如果您使用的函数如
+
没有文件名参数,则需要存储文件名


您还可以在适当的时间延迟下运行
removeTmpFiles
,例如,在脚本末尾运行
removeTmpFiles(h=0.5)

我无法立即想到可能的原因。因此,这并不能直接回答您的问题,但它确实提出了一条替代路径

我会在每个步骤中使用
filename
参数,并使用进程id分配唯一的文件名;或者我会存储临时文件名(如果文件很小,可能是“”),然后在处理完这些文件后删除它们。如果您使用的函数如
+
没有文件名参数,则需要存储文件名


您还可以在适当的时间延迟下运行
removeTmpFiles
,例如脚本末尾的
removeTmpFiles(h=0.5)

谢谢您的建议。我的工作是简单地拼接光栅层,这样在计算结束之前临时文件不会填满硬盘。此外,我意识到没有必要为每个进程设置一个特定的temp dir,因为在并行设置(至少使用foreach)中,每个进程都会获得一个特定的默认temp dir,可以使用tmpDir()从每个进程中调用它,从而在不影响其他进程的temp文件的情况下删除它。但是为什么有些函数不在指定的tmpdir中生成它们的临时文件这个问题仍然没有答案。我可以问一些关于filename参数的澄清吗?当我处理无法在内存中读取的大型光栅时,我总是向filename参数传递一个输出路径。当我第一次看到尽管我传递了一个文件名,但有时仍然会生成临时文件(通常是我问题中描述的函数和光栅层)。关于光栅临时文件的生成,我是否缺少一些东西;但是如果没有看到代码,很难评论。谢谢你的建议。我的工作是简单地拼接光栅层,这样在计算结束之前临时文件不会填满硬盘。此外,我意识到没有必要为每个进程设置一个特定的temp dir,因为在并行设置(至少使用foreach)中,每个进程都会获得一个特定的默认temp dir,可以使用tmpDir()从每个进程中调用它,从而在不影响其他进程的temp文件的情况下删除它。但是为什么有些函数不在指定的tmpdir中生成它们的临时文件这个问题仍然没有答案。我可以问一些关于filename参数的澄清吗?当我处理无法在内存中读取的大型光栅时,我总是向filename参数传递一个输出路径。当我第一次看到尽管我传递了一个文件名,但有时仍然会生成临时文件(通常是我问题中描述的函数和光栅层)。关于光栅临时文件的生成,我是否缺少一些东西;但是,如果没有看到代码,就很难进行评论。
canProcessInMemory(processname, verbose = T)
memory stats in GB
mem available: 9.66
        60%  : 5.8
mem needed   : 28.07
max allowed  : 4.66  (if available)
[1] FALSE