关于函数R doParallel和doMCR 之间的区别是什么foreach?doParallel支持windows,unix-like,同时doMC仅支持unix-like.换句话说,为什么doParallel不能doMC直接替换?谢谢.
更新:
doParallel是建立在parallel,这基本上是对等合并multicore,并snow和自动使用系统的相应工具.因此,我们可以doParallel用来支持多系统.换句话说,我们可以doParallel用来代替doMC.
参考:http://michaeljkoontz.weebly.com/uploads/1/9/9/4/19940979/parallel.pdf
顺便说一下,registerDoParallel(ncores=3)和之间有什么区别
cl <- makeCluster(3)
registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)
它似乎registerDoParallel(ncores=3)可以自动停止集群,而第二个不会自动停止和需要stopCluster(cl).
参考:http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf
这篇文章的另一个潜在标题可能是"当r中的并行处理时,核心数量,循环块大小和对象大小之间的比例是否重要?"
我有一个语料库我正在运行一些使用tm包的转换.由于语料库很大,我使用多路并行包进行并行处理.
有时转换完成任务,但有时它们不会.例如,tm::removeNumbers().语料库中的第一个文档的内容值为"n417".因此,如果预处理成功,那么此doc将转换为"n".
下面的样本语料库用于复制.这是代码块:
library(tidyverse)
library(qdap)
library(stringr)
library(tm)
library(textstem)
library(stringi)
library(foreach)
library(doParallel)
library(SnowballC)
corpus <- (see below)
n <- 100 # this is the size of each chunk in the loop
# split the corpus into pieces for looping to get around memory issues with transformation
nr <- length(corpus)
pieces <- split(corpus, rep(1:ceiling(nr/n), each=n, length.out=nr))
lenp <- length(pieces)
rm(corpus) # save memory
# save pieces to rds files since not enough RAM
tmpfile <- tempfile()
for (i in …Run Code Online (Sandbox Code Playgroud) 我写了一个简单的矩阵乘法来测试我的网络的多线程/并行化功能,我注意到计算速度比预期慢得多.
测试很简单:乘以2个矩阵(4096x4096)并返回计算时间.矩阵和结果都没有存储.计算时间并不简单(50-90秒,具体取决于您的处理器).
条件:我使用1个处理器重复这个计算10次,将这10个计算分成2个处理器(每个5个),然后是3个处理器,......最多10个处理器(每个处理器1个计算).我预计总计算时间会逐步减少,我预计10个处理器完成计算的速度是一个处理器执行相同操作的10倍.
结果:相反,我得到了什么只是在计算时间是5倍2倍减少慢于预期.
当我计算每个节点的平均计算时间时,我希望每个处理器在相同的时间内(平均)计算测试,而不管分配的处理器数量.我惊讶地发现仅仅向多个处理器发送相同的操作会减慢每个处理器的平均计算时间.
任何人都可以解释为什么会这样吗?
请注意,这个问题不是这些问题的重复:
要么
因为测试计算不是微不足道的(即50-90秒而不是1-2秒),并且因为我可以看到处理器之间没有通信(即除了计算时间之外没有返回或存储结果).
我已经附加了脚本和函数以供复制.
library(foreach); library(doParallel);library(data.table)
# functions adapted from
# http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/BLAS_Testing.html
Matrix.Multiplier <- function(Dimensions=2^12){
# Creates a matrix of dim=Dimensions and runs multiplication
#Dimensions=2^12
m1 <- Dimensions; m2 <- Dimensions; n <- Dimensions;
z1 <- runif(m1*n); dim(z1) = c(m1,n)
z2 <- runif(m2*n); dim(z2) = c(m2,n)
a <- proc.time()[3]
z3 <- z1 %*% t(z2)
b <- proc.time()[3]
c <- b-a
names(c) <- NULL …Run Code Online (Sandbox Code Playgroud) 我有一个foreach的问题,我无法搞清楚.以下代码在我尝试过的两台Windows计算机上失败,但在三台Linux计算机上运行成功,所有这些都运行相同版本的R和doParallel:
library("doParallel")
registerDoParallel(cl=2,cores=2)
f <- function(){return(10)}
g <- function(){
r = foreach(x = 1:4) %dopar% {
return(x + f())
}
return(r)
}
g()
Run Code Online (Sandbox Code Playgroud)
在这两台Windows计算机上,返回以下错误:
Error in { : task 1 failed - "could not find function "f""
Run Code Online (Sandbox Code Playgroud)
但是,这在Linux计算机上运行得很好,并且使用%do%而不是%dopar%也可以正常工作,并且适用于常规for循环.
同样是变量,如设置真正的i <- 10和更换return(x + f())用return(x + i)
对于具有相同问题的其他人,有两种解决方法:
1)使用.export显式导入所需的函数和变量:
r = foreach(x=1:4, .export="f") %dopar%
Run Code Online (Sandbox Code Playgroud)
2)导入所有全局对象:
r = foreach(x=1:4, .export=ls(.GlobalEnv)) %dopar%
Run Code Online (Sandbox Code Playgroud)
这些变通方法的问题在于,对于一个积极开发的大型软件包来说,它们并不是最稳定的.无论如何,foreach应该表现得像.
是什么导致了这个以及是否有修复的想法?
该功能的计算机版本信息:
R version 3.2.2 (2015-08-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS release 6.5 (Final)
other …Run Code Online (Sandbox Code Playgroud) registerDoParallel使用doParallel软件包时集群和核心有什么区别?
我的理解是正确的,在单机上这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)
和
registerDoParallel(cores = 4)
Run Code Online (Sandbox Code Playgroud)
我看到的唯一区别makeCluster()是必须明确停止使用stopCluster().
我正在尝试训练几个随机森林(用于回归)让他们竞争,看看哪个特征选择和哪个参数给出最佳模型.
然而,训练似乎花了很多时间,我想知道我做错了什么.
我用于训练的数据集(train下面称为)有217k行和58列(其中只有21列作为随机森林中的预测变量.它们都是numeric或者integer,除了布尔值,它是类的character该y输出是numeric).
我跑到下面的代码四次,给值4,100,500,2000到nb_trees:
library("randomForest")
nb_trees <- #this changes with each test, see above
ptm <- proc.time()
fit <- randomForest(y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
+ x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 …Run Code Online (Sandbox Code Playgroud) parallel-processing r random-forest parallel-foreach doparallel
我将如何RSelenium并行运行?
以下是rvest并行使用的示例
library(RSelenium)
library(rvest)
library(magrittr)
library(foreach)
library(doParallel)
URLsPar <- c("http://www.example.com/", "http://s5.tinypic.com/n392s6_th.jpg", "http://s5.tinypic.com/jl1jex_th.jpg",
"http://s6.tinypic.com/16abj1s_th.jpg", "http://s6.tinypic.com/2ymvpqa_th.jpg")
(detectCores() - 1) %>% makeCluster %>% registerDoParallel
ws <- foreach(x = 1:length(URLsPar), .packages = c("rvest", "magrittr", "RSelenium")) %dopar% {
URLsPar[x] %>% read_html %>% as("character")}
stopImplicitCluster()
Run Code Online (Sandbox Code Playgroud) 我有一个包含循环的函数
myfun = function(z1.d, r, rs){
x = z1.d[,r]
or.d = order(as.vector(x), decreasing=TRUE)[rs]
zz1.d = as.vector(x)
r.l = zz1.d[or.d]
y=vector()
for (i in 1:9)
{
if(i<9) y[i]=mean( x[(x[,r] >= r.l[i] & x[,r] < r.l[i+1]),r] ) else{
y[i] = mean( z1.d[(x >= r.l[9]),r] )}
}
return(y)
}
Run Code Online (Sandbox Code Playgroud)
rs是数字向量,z1.d是动物园,y也是数字向量.
当我尝试在并行循环中运行函数时:
cls = makePSOCKcluster(8)
registerDoParallel(cls)
rlarger.d.1 = foreach(r=1:dim(z1.d)[2], .combine = "cbind") %dopar% {
myfun(z1.d, r, rs)}
stopCluster(cls)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error in { : task 1 failed - "incorrect number of dimensions"
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但我意识到如果我从我的函数中取出循环它不会给出错误.
此外,如果我使用%do%而不是%dopar%运行完全相同的代码(因此不能并行运行),它可以正常工作(缓慢但没有错误).
编辑:这里要求的是参数的示例: …
我有以下简单的示例Rmarkdown文档(test.Rmd):
---
title: "Test Knit Caret Paralell VerboseIter"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
require(caret)
require(doParallel)
```
## data
```{r data}
set.seed(998)
training <- twoClassSim()
```
## model
```{r fitmodel}
fitControl <- trainControl(
method = "repeatedcv",
number = 3,
repeats = 2,
verboseIter = T)
ncores <- detectCores()-1
cl <<- makePSOCKcluster(ncores, verbose = TRUE, outfile = "")
registerDoParallel(cl)
set.seed(825)
Fit <- train(Class ~ .,
data = training,
method = "nnet",
trControl = fitControl,
trace = …Run Code Online (Sandbox Code Playgroud) 我试图通过使用doParallelR中的包来减少我的代码的运行时间.
我正在调用一个函数awareRateSIR,在这个函数的主体中使用了一些额外的包.我得到一些错误
找不到功能"vcount"和..
我知道vcount是包的功能,igraph即在使用awareRateSIR),但它不是唯一的一个.我怎么解决这个问题?我以为我应该传递我的函数中使用的所有包名,awareRateSIR但我不知道我怎么不能导出多个函数foreach或如何导出多个包名.
这是我的代码:
tp<-foreach(i=1:iter, .inorder = FALSE, .export = "awareRateSIR",
.packages = "igraph", .packages="doParallel")%dopar%{
tp <- awareRateSIR(graphContact, graphCom,state)
return(tp)
}
Run Code Online (Sandbox Code Playgroud)
如果我没有传递这些包,我将得到错误状态,如果我传递所有包,我会得到错误的一些函数是未知的:
foreach中的错误(i = 1:iter,.inorder = FALSE,.export ="awareRateSIR",:形式参数".packages"由多个实际参数匹配"
提前致谢
doparallel ×10
r ×10
foreach ×4
domc ×1
r-caret ×1
rparallel ×1
rselenium ×1
text-mining ×1
tm ×1