我用fread与foreach和doParallel在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)
我正在分别具有 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) 我正在尝试编写一个并行化的 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) 我开发了一个包含令人难以置信的并行功能的R包.
我希望以对用户透明的方式实现这些功能的并行化,而不管他/她的OS(至少理想情况下).
我环顾四周看看其他软件包作者是如何导入基于foreach的Parallelism的.例如,Max Kuhn的caret包导入foreach要使用,%dopar%但依赖 于用户指定并行后端.(使用了几个示例doMC,这在Windows上不起作用.)
注意doParallel适用于Windows和Linux/OSX并使用内置parallel包(请参阅此处的注释以进行有用的讨论),导入doParallel并registerDoParallel()在用户指定parallel=TRUE为参数时调用函数是否有意义?
我正在使用foreach和parallel库来执行并行计算,但由于某种原因,在运行时,它一次仅使用 1 个 CPU(我使用“top”(Linux 终端上的 Bash)进行查找。
服务器有48核,我尝试过:
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并行化我的一些代码.因此,在下面的示例中,我想使用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的所有输出,只是为了学习如何?
假设我想foreach在doParallel包中使用返回两个不同维度的数据框列表,如下所示:
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.
下面您可以在 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) 在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.
我有一个基于 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?