Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R foreach()下并行运行时无法识别动态库依赖项_R_Linux_Environment Variables_Parallel Foreach - Fatal编程技术网

在R foreach()下并行运行时无法识别动态库依赖项

在R foreach()下并行运行时无法识别动态库依赖项,r,linux,environment-variables,parallel-foreach,R,Linux,Environment Variables,Parallel Foreach,我正在使用Rfast包,它导入包RcppZiggurat。我正在Linux集群(Red Hat 6.1)上运行R3.6.3。软件包安装在我的本地目录上,但R安装在系统范围内 当我直接调用Rfast函数(例如,colsums())时,它们工作得很好。但是当我在foreach()循环中调用它们时,如下所示(编辑:正如Rui Barradas指出的那样,我添加了注册集群的代码,但它没有解决问题) 库(Rfast) 图书馆(双平行) 图书馆(foreach) 核心以下工作没有问题。与问题中的代码不同,它

我正在使用
Rfast
包,它导入包
RcppZiggurat
。我正在Linux集群(Red Hat 6.1)上运行R3.6.3。软件包安装在我的本地目录上,但R安装在系统范围内

当我直接调用Rfast函数(例如,
colsums()
)时,它们工作得很好。但是当我在
foreach()
循环中调用它们时,如下所示(编辑:正如Rui Barradas指出的那样,我添加了注册集群的代码,但它没有解决问题)

库(Rfast)
图书馆(双平行)
图书馆(foreach)

核心以下工作没有问题。与问题中的代码不同,它首先检测可用内核的数量,创建一个集群并使其可供
foreach
使用

library(Rfast)
library(doParallel)
library(foreach)

cores <- detectCores()
cl <- makeCluster(cores)
registerDoParallel(cl)

set.seed(2020)
A <- matrix(rnorm(1e6), 1000, 1000)
cm <- foreach(n = 1:4, 
              .combine = rbind, 
              .packages = "Rfast") %dopar% {
  colmeans(A)
}

stopCluster(cl)

str(cm)
#num [1:4, 1:1000] -0.02668 -0.02668 -0.02668 -0.02668 0.00172 ...
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:4] "result.1" "result.2" "result.3" "result.4"
#  ..$ : NULL
库(Rfast)
图书馆(双平行)
图书馆(foreach)

coresforeach的
foreach
package在当时非常棒。但是,现在,应该使用
future
进行并行计算,只为静态代码分析处理正确的输出到工人。因此,在
future
方法下,不需要向
.packages=
注册包。此外,
future
镜像了通常的R代码,只对设置输出变量作为
listenv
进行了轻微更改。例如,我们有:

库(“未来”)
图书馆(“listenv”)
图书馆(“Rfast”)
计划(调整(多进程,工人=2L))
#对于所有磁芯,直接使用:
#计划(多进程)
#生成矩阵一次

A感谢@RuiBarradas和@coatless的回答,我意识到问题不在于
foreach()
,因为(1)问题发生在我使用
future
运行代码时,以及(2)问题发生在
foreach()
代码时,即使在错误的调用中,我没有注册集群。当没有注册群集时,
foreach()
将抛出警告并以顺序模式运行。但那没有发生

因此,我意识到问题一定是在调用
foreach()
之前发生的。在日志中,它出现在消息
加载包RcppZiggurat
之后。加载此程序包时一定出了问题

然后,我检查了
RcppZiggurat
的依赖关系,发现它依赖于另一个名为
RcppGSL
的包,该包连接R和GSL库。答对了,这就是调用RcppZiggurat时需要
libgsl.so.0
的地方

因此,我制作了一个名为
test gsl.R
的R脚本,它有以下两行代码

库(RcppZiggurat)
打印('确定')
现在,我在head节点上运行以下命令

$ module load R/3.6.3
$ Rscript test-gsl.R
一切正常。“确定”被打印出来

但是,如果我在计算节点上提交作业,这将不起作用。首先,名为
test.sh
的PBS脚本如下

### Resources request
#PBS -l select=1:ncpus=1:mem=1GB

### Walltime
#PBS -l walltime=00:01:00

echo Working directory is $PBS_O_WORKDIR
cd $PBS_O_WORKDIR

### Run R
module load R/3.6.3
Rscript test-gsl.R
然后我跑了

qsub test.sh
错误突然出现了。这意味着在我的系统上,compute节点和head节点之间有一些不同,与包无关。我联系了系统管理员,他向我解释说GSL库在head节点的默认路径上可用,但在compute节点上不可用。因此,在我的shell脚本中,我需要在运行R脚本之前添加
模块加载gsl/2.1
。我测试了一下,一切正常


这个解决方案似乎很简单,但我对实现它的Linux管理知之甚少。只有在四处打听并尝试(相当盲目地)许多事情之后,我才最终得出这个解决方案。因此,感谢那些提供帮助的人,我一开始无法准确描述问题,这是我的过错。

我还尝试了
export-LD\u-LIBRARY\u-PATH=$LD\u-LIBRARY\u-PATH:/usr/lib64/
,并在
foreach()
调用中添加了
.packages=c('Rfast',RcppZiggurat')
。两个都失败了。你试过重新安装包
Rfast
?为什么要在这里重复发布?对不起,@DirkEddelbuettel。我在脆弱和沮丧的时刻发布了GitHub问题。我迫切需要代码来工作,因为我将在一个月内提交我的论文。几天来我一直在尝试解决依赖关系,但它们总是一个接一个地出现,我想放弃。但是在发布GitHub问题几个小时后,我平静下来,做了一些测试,意识到这是因为并行处理。所以我觉得在这里发帖是合适的。我不知道交叉张贴是不合适的。吸取的教训。我很抱歉。@RuiBarradas是的,我尝试过重新安装,首先是
RcppZiggurat
,然后是
Rfast
,但它没有解决问题。我只是测试了一下,但不幸的是,这对我来说不起作用。我的例子不正确,它意外地再现了错误。但是在实际的用例中,
foreach()
是从
GA::GA()
调用的,它本身已经完成了集群注册。在Windows上,我不需要单独注册,代码可以正常工作。当我移植到Linux时,它失败了。如果您的问题(@Drumy)是
GA::GA
没有成功导出库(我认为这是包中的一个bug),您是否尝试过1)更新包?2) 覆盖函数定义,手动添加导出。这可以使用函数定义的复制粘贴或使用
edit(GA::GA)
手动完成。函数本身只调用了一个
foreach
,因此很容易修复。谢谢你,奥利弗。是的,GA软件包已更新(实际上它是一个新安装)。但我认为这不仅仅是GA,因为手动导出上面的Rui代码也不起作用。谢谢你的建议。我刚刚尝试了您的代码,但仍然出现相同的错误。@Drumy我删除了
futureOf()
部分。如果你经营abo
### Resources request
#PBS -l select=1:ncpus=1:mem=1GB

### Walltime
#PBS -l walltime=00:01:00

echo Working directory is $PBS_O_WORKDIR
cd $PBS_O_WORKDIR

### Run R
module load R/3.6.3
Rscript test-gsl.R
qsub test.sh