Почему некоторые растровые функции записывают временные файлы в указанный временный каталог, а некоторые нет?

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

Идея состоит в том, что каждый процесс включает команды, которые: устанавливают зависящий от процесса 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)

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

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

Но если я запустил calc, overlay или aggregate, мой process_tmp_dir останется пустым, а временные файлы появятся в каталоге temp по умолчанию. Однако после этого 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 и т. Д.) Я был бы очень признателен за любые предложения, почему это так, и что можно сделать, чтобы убедиться, что временные файлы любой растровой функции генерируются в указанном tmpDir().

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


person valium    schedule 01.04.2020    source источник


Ответы (1)


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

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

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

person Robert Hijmans    schedule 01.04.2020
comment
Спасибо за предложения. Моя работа заключалась в том, чтобы просто расположить мои растровые слои мозаикой, чтобы временные файлы не заполняли жесткий диск до завершения вычислений. Кроме того, я понял, что установка определенного временного каталога для каждого процесса не требуется, потому что при параллельной настройке (по крайней мере, с foreach) каждый процесс получает конкретный временный каталог по умолчанию, который может быть вызван с помощью tmpDir () изнутри каждого процесса и, следовательно, удален без влияющие на временные файлы других процессов. Но вопрос о том, почему некоторые функции не генерируют свои временные файлы в указанном tmpdir, остается без ответа. - person valium; 04.04.2020
comment
Могу я попросить разъяснений относительно аргумента имени файла? Я всегда передаю выходной путь аргументу имени файла, когда работаю с большими растрами, которые не могут быть прочитаны в памяти. Я был удивлен, когда впервые увидел, что иногда (обычно с функциями и растровыми слоями, описанными в моем вопросе) временные файлы все еще генерируются, хотя я передавал имя файла. Что-то мне не хватает при создании растровых временных файлов? - person valium; 04.04.2020
comment
Не должно быть; но сложно комментировать, не увидев кода. - person Robert Hijmans; 05.04.2020