Почему некоторые растровые функции записывают временные файлы в указанный временный каталог, а некоторые нет? - PullRequest
1 голос
/ 01 апреля 2020

Я хочу контролировать, где хранятся временные файлы, сгенерированные растровыми функциями. Причина в том, что я хочу иметь возможность удалять временные файлы, которые указаны для процесса c, без удаления тех, которые используются в других процессах, работающих параллельно. Это было предложено Люком Маколей здесь .

Идея состоит в том, что каждый процесс имеет команды, которые: устанавливают спецификацию процесса c tmpdir, затем запускают некоторую растровую функцию, сохраняют ее процесс-спецификация c выводит куда-то еще, чем tmpDir(), и, наконец, удаляет процесс-спецификацию c tmpDir().

Но некоторые растровые операции сохраняют свои временные файлы в временном каталоге по умолчанию (выглядит как C:\Users\...\Temp\RtmpaevgEe). Следовательно, эти временные файлы не могут быть удалены в конце каждого процесса и в конечном итоге рискуют заполнить жесткий диск. Это происходит как независимо от того, выполняется ли он для одного процесса, в итеративном l oop процессов или в параллельной настройке.

Мой код для установки временного каталога, определяемого процессом c:

# 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)

rasterOptions() или tmpDir() действительно возвращает process_tmp_dir и не является временным каталогом по умолчанию, который возвращался до команды rasterOptions(tmpdir=process_tmp_dir).

Затем, если я запускаю операцию mask (растр, метод Spatial), временные файлы создаются в process_tmp_dir, как и ожидалось.

Но если я запускаю calc, overlay или aggregate, мой process_tmp_dir остается пустым, пока временные файлы появляются во временном каталоге по умолчанию. Однако после этого rasterOptions() или tmpDir() вернут process_tmp_dir.

В каждом случае я указывал 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

Интересно, почему эти функции не "соответствуют" новой настройке tmpdir, а mask. (Также обратите внимание, что mask генерирует .grd, гораздо более тяжелые, временные файлы, чем те, .tif, сгенерированные calc et c ..) Я был бы очень признателен за любые предположения, почему это так, и что может быть сделано, чтобы убедиться, что временные файлы любой растровой функции генерируются в указанном tmpDir().

. Я могу сделать данные доступными и указать точные растровые операции, если вы считаете, что это необходимо, чтобы лучше понять, что происходит ,

1 Ответ

0 голосов
/ 02 апреля 2020

Я не могу сразу думать о том, что может вызвать это. Так что это не отвечает на ваш вопрос напрямую, но предлагает альтернативный путь.

Я бы использовал аргумент filename на каждом шаге и назначил уникальные имена файлов с помощью идентификатора процесса; или я бы сохранил имена временных файлов (которые могут быть "", если файл небольшой), а затем удалил эти файлы, когда вы закончите с ними. Сохранение имени файла будет необходимо, если вы используете такие функции, как +, которые не имеют аргумента имени файла.

Вы также можете запустить removeTmpFiles с соответствующей временной задержкой, например, removeTmpFiles(h=0.5) в конце сценария.

...