标签: doparallel

R中doMC和doParallel之间的区别

关于函数R doParalleldoMCR 之间的区别是什么foreachdoParallel支持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

parallel-processing r domc doparallel

49
推荐指数
1
解决办法
1万
查看次数

使用多个核时,tm_map转换函数的行为不一致

这篇文章的另一个潜在标题可能是"当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)

parallel-processing r text-mining tm doparallel

24
推荐指数
1
解决办法
607
查看次数

为什么每个额外节点的foreach%dopar%会变慢?

我写了一个简单的矩阵乘法来测试我的网络的多线程/并行化功能,我注意到计算速度比预期慢得多.

测试很简单:乘以2个矩阵(4096x4096)并返回计算时间.矩阵和结果都没有存储.计算时间并不简单(50-90秒,具体取决于您的处理器).

条件:我使用1个处理器重复这个计算10次,将这10个计算分成2个处理器(每个5个),然后是3个处理器,......最多10个处理器(每个处理器1个计算).我预计总计算时间会逐步减少,我预计10个处理器完成计算的速度是一个处理器执行相同操作的10倍.

结果:相反,我得到了什么只是在计算时间是5倍2倍减少于预期.

在此输入图像描述

当我计算每个节点的平均计算时间时,我希望每个处理器在相同的时间内(平均)计算测试,而不管分配的处理器数量.我惊讶地发现仅仅向多个处理器发送相同的操作会减慢每个处理器的平均计算时间.

在此输入图像描述

任何人都可以解释为什么会这样吗?

请注意,这个问题不是这些问题的重复:

foreach%dopar%比环路慢

要么

为什么并行包慢于使用apply?

因为测试计算不是微不足道的(即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)

parallel-processing foreach multithreading r doparallel

20
推荐指数
1
解决办法
2572
查看次数

doParallel"foreach"不一致地从父环境继承对象:"{:task 1 failed - "中的错误找不到函数......"

我有一个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)

parallel-processing foreach r doparallel

15
推荐指数
2
解决办法
9267
查看次数

doParallel,cluster vs cores

registerDoParallel使用doParallel软件包时集群和核心有什么区别?

我的理解是正确的,在单机上这些是可以互换的,我会得到相同的结果:

cl <- makeCluster(4)
registerDoParallel(cl)    
Run Code Online (Sandbox Code Playgroud)

registerDoParallel(cores = 4)
Run Code Online (Sandbox Code Playgroud)

我看到的唯一区别makeCluster()是必须明确停止使用stopCluster().

r rparallel doparallel

13
推荐指数
3
解决办法
4209
查看次数

如何加快随机森林的训练?

我正在尝试训练几个随机森林(用于回归)让他们竞争,看看哪个特征选择和哪个参数给出最佳模型.

然而,训练似乎花了很多时间,我想知道我做错了什么.

我用于训练的数据集(train下面称为)有217k行和58列(其中只有21列作为随机森林中的预测变量.它们都是numeric或者integer,除了布尔值,它是类的charactery输出是numeric).

我跑到下面的代码四次,给值4,100,500,2000nb_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

11
推荐指数
2
解决办法
9855
查看次数

并行运行RSelenium

我将如何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)

r rselenium doparallel

8
推荐指数
1
解决办法
1014
查看次数

使用多重并行在foreach循环内循环

我有一个包含循环的函数

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%运行完全相同的代码(因此不能并行运行),它可以正常工作(缓慢但没有错误).

编辑:这里要求的是参数的示例: …

foreach r doparallel

8
推荐指数
1
解决办法
1197
查看次数

Rmarkdown中的插入符doparallel:使用render()时缺少详细信息

我有以下简单的示例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)

r r-caret doparallel

8
推荐指数
1
解决办法
173
查看次数

如何在"R"中的foreach循环中导出多个函数或包

我试图通过使用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"由多个实际参数匹配"

提前致谢

foreach r doparallel

7
推荐指数
1
解决办法
5170
查看次数