我无法在foreach%dopar%循环中将任何包加载到并行进程。
我使用foreach和doSNOW包成功创建了4个SOCK集群,然后尝试运行一个简单的并行进程。它使用%dopar%而不使用任何包,但加载任意包会引发错误。
下面的示例代码,后面是显示正在使用的软件包的会话信息。
我之前使用过这种类型的代码没有问题。我公司最近的一些网络更改意味着我必须更改一些设置(默认库路径等),可能与该更改有关。不知道从哪里开始排除问题所在 - 任何帮助都非常感谢!
#load foreach and doSNOW packages, setup 4 clusters#
> require(foreach)
> require(doSNOW)
> registerDoSNOW(makeCluster(4, type = "SOCK"))
> getDoParWorkers()
[1] 4
> getDoParName()
[1] "doSNOW"
# %dopar% loop without loading any packages -- works OK #
> foreach(i=1:2) %dopar%
{
i+1
}
[[1]]
[1] 2
[[2]]
[1] 3
# %dopar% loop with loading a package -- does not work #
> foreach(i=1:2,.packages="forecast") %dopar%
{
i+1
}
Error in e$fun(obj, substitute(ex), parent.frame(), e$data) :
worker initialization failed: package or namespace load failed for 'forecast'
会话信息: R版本3.2.1(2015-06-18) 平台:x86_64-w64-mingw32 / x64(64位) 运行于:Windows 7 x64(内部版本7601)Service Pack 1
区域设置:
[1] LC_COLLATE = English_United States.1252 LC_CTYPE = English_United States.1252 LC_MONETARY = English_United States.1252 LC_NUMERIC = C
[5] LC_TIME = English_United States.1252
附加基础包: [1] stats graphics grDevices utils数据集方法库
其他附件包:
[1] WriteXLS_3.6.1 rlist_0.4 timeSeries_3012.99 reshape2_1.4.1 plyr_1.8.3 lubridate_1.3.3 lmtest_0.9-34 lattice_0.20-31 knitr_1.10.5
[10] hts_4.5 Matrix_1.2-1 SparseM_1.6 ggplot2_1.0.1 data.table_1.9.4 car_2.0-25 forecast_6.1 timeDate_3012.100 zoo_1.7-12
[19] doSNOW_1.0.12 snow_0.3-13 iterators_1.0.7 foreach_1.4.2
通过命名空间加载(而不是附加):
[1] Rcpp_0.11.6 compiler_3.2.1 nloptr_1.0.4 tseries_0.10-34 tools_3.2.1 lme4_1.1-8 digest_0.6.8 memoise_0.2.1 gtable_0.1.2 nlme_3.1-120
[11] mgcv_1.8-6 parallel_3.2.1 proto_0.3-10 stringr_1.0.0 grid_3.2.1 nnet_7.3-9 minqa_1.2.4 magrittr_1.5 scales_0.2.5 codetools_0.2-11
[21] MASS_7.3-40 splines_3.2.1 pbkrtest_0.4-2 colorspace_1.2-6 fracdiff_1.4-2 quantreg_5.11 quadprog_1.5-5 stringi_0.5-5 munsell_0.4.2 chron_2.3-47
其他可能有用的信息 - .libPaths()位置和makeCluster函数的详细信息。
> .libPaths()
[1] "C:/Users/G082580/Documents/My Documents/R/R-3.2.1" "C:/R-3.2.1/library"
> makeCluster(4,type="SOCK",manual=TRUE)
在localhost上手动启动worker C:/R-32~1.1/bin/Rscript.exe“C:/ Users / G082580 / Documents / My Documents / R / R-3.2.1 / snow / RSOCKnode.R”MASTER = localhost PORT = 11535 OUT = / dev / null SNOWLIB = C:/ Users / G082580 / Documents / My Documents / R / R-3.2.1
答案 0 :(得分:2)
如果您需要使用.libPaths
功能来加载主程序包,您还需要在工作程序上调用它。此示例使用clusterCall
函数将worker初始化为与master相同:
library(doSNOW)
cl <- makeSOCKcluster(4)
registerDoSNOW(cl)
clusterCall(cl, function(x) .libPaths(x), .libPaths())