загадочная ошибка от foreach - PullRequest
1 голос
/ 28 января 2011

На моем первом наборе в foreach я получаю эту ошибку:

   Error in function (handle)  :
  no function to return from, jumping to top level

Я получаю одно из них на каждого работника.

Я использую doMC / многоядерный сервер.

Сначала я подумал, что это вызвано текстовыми индикаторами выполнения, которые функция внутри моего вызова foreach пыталась отправить на консоль в качестве побочного эффекта, но я все равно получаю сообщение об ошибке после выключения. Несмотря на ошибки, оценка продолжается, и все хомяки, похоже, работают. Функция внутри оказывается reclass () calc () из библиотеки (растр). Кто-нибудь может предположить, что это может значить? Я думал, что спрошу, пока я жду, чтобы увидеть, является ли вывод действительным.


Обновление

вот сердце кода:

    foreach( cover= names( classes), .packages= "raster") %dopar% {
      class <- classes[[ cover]]
      calc( mlct$pri,
           function( pri) {
             ifelse( is.na( pri), NA,
                    ifelse( pri ==class, 1, 0))
           },
           filename= paste(
             mlctName,
             paste( cover, ".tif", sep=""),
             sep="_"),
           overwrite= TRUE, ...)
    }

В случае незнакомства с library( raster) он предоставляет умный механизм для взаимодействия с наборами геопространственных растровых данных без необходимости сохранять их в памяти. Функции читают и записывают данные блок за блоком, как они идут. В этом случае все рабочие читают из одних и тех же исходных данных, но записывают в отдельные выходные файлы. Интересно, имеет ли этот файловый ввод / вывод какое-либо отношение к (кажущимся доброкачественным) ошибкам, о которых говорилось выше.


Теперь он выплюнул все новые файлы, которые я ожидал, но это появляется на консоли:

GDAL Error 1: TIFFFetchDirectory:Sanity check on directory count failed, this is probably not a valid IFD offset

и приглашение интерпретатора не появляется, несмотря на то, что ядра работают тихо. Я полагаю, что еще один признак того, что файловый ввод-вывод ошибся, я думаю. Есть мысли?

1 Ответ

1 голос
/ 29 января 2011

Я думаю, что у меня есть ответ. Я получил некоторую помощь от Even Rouault в списке GDAL-dev. См. Эту ветку в архивах GDAL-dev (также доступна через Nabble). Если он когда-нибудь придет, он должен получить кредит за этот ответ, а не я.

Суть в том, что мне нужно передать имена файлов наборов растровых данных для каждого сотрудника foreach и повторно создать экземпляры объектов raster () в замыкании foreach. Каждый работник должен иметь свой собственный дескриптор rgdal для чтения входных данных.

Новый код выглядит так:

  fracDoparFun <- function( priFilename, ...) {
    foreach( cover= names( classes), .packages= "raster") %dopar% {
      class <- classes[[ cover]]
      frac <-
        calc( raster( priFilename),
             function( pri) {
               ifelse( is.na( pri), NA,
                      ifelse( pri ==class, 1, 0))
             },
             filename= paste(
               mlctName,
               paste( cover, ".tif", sep=""),
               sep="_"),
             overwrite= TRUE, ...)
      return( filename( frac))
    }
  }
mlct$fracs <-
  brick( stack( fracDoparFun( filename( mlct$pri), ...)),
        filename= fracsBrickFile,
        overwrite= TRUE,
        ...)

Теперь fracDoparFun() возвращает список имен файлов, которые являются выходными данными, сгенерированными рабочими, которые затем собираются в один многополосный результат функцией brick().

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

...