2017-08-27 108 views
0

我遇到以下問題。我需要的變量timeindex在我的全球環境,但是當我想從我的全球環境的並行處理時將其導出爲我的集羣中,我得到了以下信息:如何在foreach循環中運行clusterExport(操作系統:Windows)

錯誤{:任務1失敗 - 「對象 'SZENARIO' 未找到」

我的原代碼,這會產生錯誤小例子:

Historical <- structure(c(18.5501872568473, 24.3295787432955, 14.9342384460288, 
    13.0653757599636, 8.67294618896797, 13.4587662721594, 20.792126254714, 
    17.5162747884424, 28.8253151239752, 23.0568765432192), index = structure(c(-7305, 
    -7304, -7303, -7302, -7301, -7300, -7299, -7298, -7297, -7296 
    ), class = "Date"), class = "zoo") 

    Szenario <- structure(c(10.2800684124652, 14.5495871489361, 9.8565852930294, 
    21.1654540678686, 21.1936990312861, 12.4209005842752, 9.77473132000267, 
    17.1997402736739, 17.884107611858, 13.622588360244), index = structure(c(13149, 
    13150, 13151, 13152, 13153, 13154, 13155, 13156, 13157, 13158 
    ), class = "Date"), class = "zoo") 

    library(doParallel) 
    library(foreach)  
    library(raster) 
    library(zoo) 
    library(parallel) 

    # Parallelisation Settings 
    # Definition of how many cores you want to use 
    UseCores <- detectCores() -2 # -1 at max because one core has to be used for other tasks 
    # Register CoreCluster 
    cl <- makeCluster(UseCores) 
    registerDoParallel(cl) 

foreach(fn=1:1) %dopar% { 

    library(raster) # needed libraries have to be loaded inside the loop, while parallel processing occurs 
    library(zoo) 
    library(base) 
    library(parallel) 

    #In my original script, I'm looping through Filenames, which are called like my variables in my Global environment (without .tif at the end of the filename), variables names are saved as characters 
    file.referenz.name <- c("Historical") 
    file.szenario.name <- c("Szenario") 

    #Create timeindex für rasterstacks to subset later on with them (getZ, setZ) 

    clusterExport(cl, varlist = c(file.szenario.name, file.referenz.name), envir = .GlobalEnv) 
    time.index.szenario <- index(get(file.szenario.name)) 
    time.index.referenz <- index(get(file.referenz.name)) 

} 

#end cluster 
stopCluster(cl) 

回答

1

試試這個

foreach(fn=1:1, .export=c("Szenario"), 
       .packages=c("raster", "zoo", "base", "parallel") %dopar% 

它在%dopar% {}clusterExport混淆。您可以clusterExport每個clforeach之前,或者乾脆用.exportforeach

您可以刪除在%dopar% {}library語句。

+0

謝謝。我可以從我的全球環境中導出所有變量嗎? .export = environment()' – Nucore

+1

好吧,它的'.export = ls(.GlobalEnv)' – Nucore

+1

要小心導出* everything *,因爲導出不需要導出的很多和/或大的對象將會添加大量的開銷。相反,嘗試仔細確定所需的全局變量集合,例如通過試驗和錯誤。或者,您可以使用doFuture後端,參見https://stackoverflow.com/a/45898676/1072091 – HenrikB