2016-02-29 10 views
8

Я использую пакет doSNOW и, более конкретно, функцию parLapply для выполнения переклассификации (а затем и других операций) в списке больших растровых наборов данных (ОС: Windows x64).Параллельная обработка больших растровых изображений в R (windows)

Код выглядит немного как этот минималистичный пример:

library(raster) 
library(doSNOW) 

#create list containing test rasters 

x <- raster(ncol=10980,nrow=10900) 
x <- setValues(x,1:ncell(x)) 

list.x <- replicate(9 , x) 

#setting up cluster 

NumberOfCluster <- 8 
cl <- makeCluster(NumberOfCluster) 
registerDoSNOW(cl) 
junk <- clusterEvalQ(cl,library(raster)) 

#perform calculations on each raster 

list.x <- parLapply(cl,list.x,function(x) calc(x,function(x) { x * 10 })) 

#stop cluster 

stopCluster(cl) 

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

> plot(list.x[[1]]) 
Error in file(fn, "rb") : cannot open the connection 
In addition: Warning message: 
In file(fn, "rb") : 
    cannot open file 'C:\Users\*****\AppData\Local\Temp\RtmpyKYdpY\raster\r_tmp_2016-02-29_133158_752_67867.gri': No such file or directory 

Насколько я понял, так как растр достаточно велики, они сохраняются в виде временного файла на диске. И когда я закрываю снеговой кластер, эти файлы больше не могут быть доступны.

Итак, мой вопрос в том, как я могу получить доступ к данным после закрытия кластера? Можно ли использовать этот метод?

Спасибо!

ответ

1

У меня был точно проблема во время работы Rasterize fucntion внутри кластера в R.

Всех тесты работали отлично, но когда я очень широкие масштабы крупные и мелкие растры разрешения, я неоднократно получал ошибки относительно временных файлов, Я даже не мог найти на своем компьютере. Объект списка, который мне нужно было объединить и записать как 1 растровый, был в R, но я ничего не мог с этим поделать.

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

+0

Спасибо Сэм!Если вы думаете об этом, это на самом деле довольно очевидно ... пробовал и работает как шарм. – Val

3

Вы могли бы передать конкретные имена файлов calc (или, например, reclassify), и есть ваша функция возвращает эти имена файлов в качестве вектора для чтения в стек:

ff <- parSapply(cl, list.x, function(x) { 
    calc(x, function(x) x*10, filename=f <- tempfile(fileext='.tif')) 
    f 
}) 

s <- stack(ff) 

Но и смотреть на ?clusterR - I Подозреваю, что он будет работать с reclassify. Из документов:

Эта функция работает только с функциями, которые имеют растровые * объект в качестве первого аргумента, и которые действуют на посотовой основе (то есть, нет никакого эффекта neigboring клеток) и возвращает объект такое же количество ячеек, что и входной растровый объект. Первым аргументом вызываемой функции должен быть объект Raster *. Может быть только один аргумент объекта Raster *. Например, он работает с calc, и он также работает с наложением, пока вы предоставляете один RasterStack или RasterBrick в качестве первого аргумента.

+0

Тем не менее, когда я пытаюсь получить доступ к данным после закрытия кластера, R не может найти временный файл и возвращает это сообщение об ошибке: '> plot (s [[1]]) Ошибка в .local (.Object, ...): C: \ Users \ ****** \ AppData \ Local \ Temp \ Rtmpsh1u3n \ file1e482e517fd9.tif 'не существует в файловой системе и не распознается как поддерживаемый набор данных name.' – Val

+0

Странный - он работает для меня. Может быть, попробуйте сохранить файлы на постоянный путь. – jbaums

+0

Спасибо. Я еще раз посмотрю на ClusterR ... Возможно, я слишком быстро перешел от этого. Также я нашел [это] (https://cran.r-project.org/web/packages/raster/vignettes/functions.pdf), который имеет кластерную функцию, которая выглядит многообещающей. – Val

 Смежные вопросы

  • Нет связанных вопросов^_^