1

foreach への最初の進出で、次のエラーが発生しました。

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

ワーカーごとに 1 つ取得します。

doMC/multicore バックエンドを使用しています。

最初は、これは foreach 呼び出し内の関数が副作用としてコンソールに送信しようとしていたテキスト進行状況バーが原因だと思っていましたが、それをオフにしてもエラーが発生します。エラーにもかかわらず、評価は続行され、すべてのハムスターが実行されているように見えます。内部の関数は、library(raster) の 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)、地理空間ラスター データ セットをメモリに取り込まずにやり取りするための巧妙なメカニズムが提供されます。関数は、データをブロックごとに読み書きします。この場合、ワーカーはすべて同じソース データから読み取りますが、個別の出力ファイルに書き込みます。このファイル I/O が、上記で報告された (一見無害な) エラーと関係があるのだろうかと思います。


これで、期待どおりの新しいファイルがすべて吐き出されましたが、コンソールに次のように表示されます。

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

コアが静かであるという事実にもかかわらず、インタープリタープロンプトは再表示されません。ファイル I/O がうまくいかないというもう 1 つの手がかりだと思います。何かご意見は?

4

1 に答える 1

1

I think I have the answer. I got some help from Even Rouault on the GDAL-dev list. See this thread in the GDAL-dev archives (also available through Nabble). If he ever comes along he should get credit for this answer, not I.

The crux of the matter is that I have to pass filenames of raster data sets to foreach workers and re-instantiate the raster() objects within the foreach closure. Each worker needs to have its own rgdal handle for reading the input data.

The new code looks like this:

  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,
        ...)

Now fracDoparFun() returns a list of filenames that are the outputs generated by the workers that are then collected into a single multi-band result by the brick() function.

Thanks for taking a look everyone. I hope I'm not closing this prematurely, but I have tested it and I wanted to capture what I had learned.

于 2011-01-29T18:59:19.433 に答える