标签: parallel-foreach

使用fread与foreach和doParallel在R中

我用freadforeachdoParallel在Ubuntu 14.04包中的R 3.2.0.以下代码工作正常,即使我没有使用registerDoParallel.

library(foreach)
library(doParallel)
library(data.table)

write.csv(iris,'test.csv',row.names=F)

cl<-makeCluster(4)

tmp<-foreach(i=1:10) %dopar% { t <- fread('test.csv') }

tmp<-rbindlist(tmp)

stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

但是,当切换到Windows 7时,无论是否有"registerDoParallel",它都不再有效.

library(foreach)
library(doParallel)
#library(doSNOW)
library(data.table)

write.csv(iris,'test.csv',row.names=F)

cl<-makeCluster(4) 
registerDoParallel(cl)
#registerDoSNOW(cl)

tmp<-foreach(i=1:10) %dopar% { t <- fread('test.csv') }

tmp<-rbindlist(tmp)

stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

'doSNOW'包也不起作用.以下是错误消息.

Error in { : task 1 failed - "could not find function "fread""
Run Code Online (Sandbox Code Playgroud)

有没有人有类似的经历?


后续问题是关于嵌套的foreach.以下似乎不起作用.

cl<-makeCluster(4)
registerDoParallel(cl)
clusterEvalQ(cl , library(data.table))

tmp<-foreach(j=1:10) %dopar% {

            tmp1<-foreach(i=1:10) %dopar% {
                          t<-fread('test.csv',data.table=T)
                   }  
            rbindlist(tmp1)
      }
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

r parallel-foreach doparallel

5
推荐指数
1
解决办法
2187
查看次数

doParallel(包)foreach 不适用于 R 中的大迭代

我正在分别具有 4 个和 8 个物理和逻辑内核的 PC(OS Linux)上运行以下代码(从doParallel 的 Vignettes 中提取)。

运行代码iter=1e+6或更少,一切都很好,我可以从 CPU 使用率中看到所有内核都用于此计算。然而,随着迭代次数的增多(例如iter=4e+6),在这种情况下并行计算似乎不起作用。当我还监视 CPU 使用率时,只有一个核心参与计算(100% 使用率)。

示例 1

require("doParallel")
require("foreach")
registerDoParallel(cores=8)
x <- iris[which(iris[,5] != "setosa"), c(1,5)]
iter=4e+6
ptime <- system.time({
    r <- foreach(i=1:iter, .combine=rbind) %dopar% {
        ind <- sample(100, 100, replace=TRUE)
        result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
        coefficients(result1)
    }
})[3]
Run Code Online (Sandbox Code Playgroud)

你知道可能是什么原因吗?记忆可能是原因吗?

我四处搜索,发现与我的问题有关,但重点是我没有出现任何错误,而且 OP 似乎通过在内部提供必要的包来提出解决方案foreach循环。但是可以看出,我的循环中没有使用任何包。

更新1

我的问题还是没有解决。根据我的实验,我不认为记忆可能是原因。我在运行以下简单并行(在所有 8 个逻辑内核上)迭代的系统上有 8GB 内存:

例2

require("doParallel")
require("foreach")

registerDoParallel(cores=8)
iter=4e+6
ptime <- system.time({
    r <- foreach(i=1:iter, …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r parallel-foreach doparallel

5
推荐指数
1
解决办法
6720
查看次数

R 中 GLM 的并行化循环

我正在尝试编写一个并行化的 for 循环,在其中我试图以最佳方式找到最佳 GLM 以仅对具有最低 p 值的变量进行建模,以查看我是否要打网球(是/否,二进制) .

例如,我有一个包含气象数据集的表(及其数据框)。我首先通过查看这些模型中的哪一个 p 值最低来构建 GLM 模型

PlayTennis ~ Precip
PlayTennis ~ Temp, 
PlayTennis ~ Relative_Humidity
PlayTennis ~ WindSpeed)
Run Code Online (Sandbox Code Playgroud)

假设PlayTennis ~ Precip具有最低的 p 值。因此,repeat 中的下一个循环迭代是查看哪些其他变量将具有最低的 p 值。

PlayTennis ~ Precip + Temp
PlayTennis ~ Precip + Relative_Humidity 
PlayTennis ~ Precip + WindSpeed
Run Code Online (Sandbox Code Playgroud)

这将一直持续到没有更显着的变量(P 值大于 0.05)。因此我们得到了PlayTennis ~ Precip + WindSpeed(这都是假设的)的最终输出。

是否有关于如何在各种内核上并行化此代码的建议?我遇到了一个speedglm从库 speedglm调用的 glm 的新函数。这确实有所改善,但并没有太大改善。我还研究了foreach循环,但我不确定它如何与每个线程通信以了解各个运行的 p 值是更大还是更低。预先感谢您的任何帮助。

d =

Time          Precip    Temp    Relative_Humidity   WindSpeed   …   PlayTennis    
1/1/2000 0:00 …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r glm parallel-foreach

5
推荐指数
0
解决办法
478
查看次数

使R包中的函数可并行化的最佳实践是什么?

我开发了一个包含令人难以置信的并行功能的R包.

我希望以对用户透明的方式实现这些功能的并行化,而不管他/她的OS(至少理想情况下).

我环顾四周看看其他软件包作者是如何导入基于foreach的Parallelism的.例如,Max Kuhn的caret包导入foreach要使用,%dopar%依赖 于用户指定并行后端.(使用了几个示例doMC,这在Windows上不起作用.)

注意doParallel适用于Windows和Linux/OSX并使用内置parallel包(请参阅此处的注释以进行有用的讨论),导入doParallelregisterDoParallel()在用户指定parallel=TRUE为参数时调用函数是否有意义?

parallel-processing r parallel-foreach r-package

5
推荐指数
2
解决办法
585
查看次数

为什么这个并行计算代码只使用1个CPU?

我正在使用foreachparallel库来执行并行计算,但由于某种原因,在运行时,它一次仅使用 1 个 CPU(我使用“top”(Linux 终端上的 Bash)进行查找。

服务器有48核,我尝试过:

  • 使用 24、12 或 5 核
  • 示例代码(如下)
  • 在 Windows 中,出现此类任务,但它们不使用任何 CPU
list.of.packages <- c("foreach", "doParallel")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if (length(new.packages)) install.packages(new.packages)

library(foreach)
library(doParallel)

no_cores <- detectCores() / 2 # 24 cores
cl<-makeCluster(no_cores)
registerDoParallel(cl)

df.a = data.frame(str = cbind(paste('name',seq(1:60000))), int = rnorm(60000))
df.b = data.frame(str = sample(df.a[, 1]))
df.b$int = NA

foreach(row.a = 1:length(df.a$str),
        .combine = rbind,
        .verbose = T)  %dopar% {
          row.b = grep(pattern = df.a$str[row.a], x = …
Run Code Online (Sandbox Code Playgroud)

r parallel-foreach doparallel

5
推荐指数
1
解决办法
1146
查看次数

R中的并行k均值

我试图了解如何使用R并行化我的一些代码.因此,在下面的示例中,我想使用k-means使用2,3,4,5,6中心对数据进行聚类,同时使用20次迭代.这是代码:

library(parallel)
library(BLR)

data(wheat)

parallel.function <- function(i) {
    kmeans( X[1:100,100], centers=?? , nstart=i )
}

out <- mclapply( c(5, 5, 5, 5), FUN=parallel.function )
Run Code Online (Sandbox Code Playgroud)

我们如何同时并行迭代和中心?如何跟踪输出,假设我想保留所有,迭代和中心的k-means的所有输出,只是为了学习如何?

parallel-processing r parallel-foreach

4
推荐指数
2
解决办法
3617
查看次数

带有foreach的两个rbinded数据帧的输出列表

假设我想foreachdoParallel包中使用返回两个不同维度的数据框列表,如下所示:

a<-NULL
b<-NULL
for(i in 1:100){
  a<-rbind(a,data.frame(input=i,output=i/2))
  if(i > 5){
    b<-rbind(b,data.frame(input=i,output=i^2))
  }
}
list(a,b)
Run Code Online (Sandbox Code Playgroud)

因为foreach返回一个对象,所以没有(至少对我来说)显而易见的方法来执行上述操作foreach.

注意:这是我实际使用的问题的一个简化版本,因此通过使用lapply(或沿着这些行的某些东西)来解决问题是行不通的.我的问题的精神是如何做到这一点foreach.

parallel-processing for-loop r parallel-foreach

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

将嵌套 for 循环转换为 R 中的并行循环

下面您可以在 R 中找到一段代码,我希望将其转换为使用多个 CPU 作为并行进程运行。我尝试使用foreachpackage,但没有走得太远。考虑到我有 3 级嵌套循环,我找不到一个很好的例子如何让它工作。我们将非常感谢您的帮助。下面的代码示例 - 我做了一个简单的函数,因此它可以作为示例:

celnum <- c(10,20,30)
t2 <- c(1,2,3)
allrepeat <- 10

samplefunction <- function(celnum,t2){

        x <- rnorm(100,celnum,t2)
        y = sample(x, 1)
        z = sample(x,1)

        result = y+z


        result 
}
Run Code Online (Sandbox Code Playgroud)

常规方式获取结果:

z_grid <- matrix(, nrow = length(celnum), ncol = length(t2))

repetitions <- matrix(, nrow = allrepeat, ncol = 1)



set.seed=20
for(i in 1:length(celnum)){
        for (j in 1:length(t2)){
                for (k in 1:allrepeat) {
                        results <- samplefunction(celnum[i],t2[j]) 
                                repetitions[k] <- results
                                z_grid[i,j] <- mean(repetitions,na.rm=TRUE) 
                } …
Run Code Online (Sandbox Code Playgroud)

parallel-processing foreach r parallel-foreach

4
推荐指数
1
解决办法
6658
查看次数

来自包doBArallel的选项"核心"在Windows上无用吗?

在Linux计算机上,以下doParallel的小插曲,我使用doParallel::registerDoParallel(),然后我用options(cores = N)哪里N是核心我想使用的数量foreach.

我可以foreach::getDoParWorkers()在更改选项时验证cores,它会自动更改使用的核心数foreach.

然而,在Windows 10(最新版本的R和软件包)上,此选项似乎没有任何影响,因为更改其值不会更改foreach::getDoParWorkers()(在3调用时初始化的值doParallel::registerDoParallel()).

可重复的例子:

doParallel::registerDoParallel()
options(cores = 1)
foreach::getDoParWorkers()
options(cores = 2)
foreach::getDoParWorkers()
options(cores = 4)
foreach::getDoParWorkers()
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?它不适用于Windows吗?

编辑:我知道如何以不同方式注册并行后端.目标是使用doParallel::registerDoParallel()一次注册(在加载我的包时),然后使用一个选项来更改使用的内核数量.这就是为什么我希望它也适用于Windows.

r parallel-foreach doparallel

3
推荐指数
1
解决办法
1366
查看次数

在 R 中使用 doParallel 的 foreach 时,Windows Defender 的 CPU 使用率非常高

我有一个基于 Threadripper 1950X 的工作站,具有 16 个内核和 32 个线程以及大量内存。在 Windows 10 上运行 64 位 R 3.6.0(已修补),我经常使用 doParallel 库和 foreach 命令在 R 中运行并行代码,经常将其设置为使用 26-30 个线程。

最近,我检查了任务管理器。随着 doParallel 开始对所有进程进行后台处理,我对 CPU 使用率上升并不感到惊讶。但非常奇怪的是,Windows Defender(Microsoft 的防病毒默认设置)也开始假脱机,而且非常积极,使用率攀升至 70%(它被列为反恶意软件服务可执行文件)。这是我的意思的截图。当 R 代码完成时,Defender 会恢复到不重要的 CPU 使用率。

在此处输入图片说明

我对后卫的CPU使用率很高的在线阅读的帖子,但这似乎非常依赖于并行的R.我试图设置排除按照像帖子操作这个,但它并不能提高的问题。

当我运行具有大量线程集的并行代码时,我是否应该担心 Windows Defender 会不断挤出 R?

r parallel-foreach doparallel

3
推荐指数
1
解决办法
538
查看次数