This is a very simple example.
df = c("already ","miss you","haters","she's cool")
df = data.frame(df)
library(doParallel)
cl = makeCluster(4)
registerDoParallel(cl)
foreach(i = df[1:4,1], .combine = rbind, .packages='tm') %dopar% classification(i)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)
In real case I have dataframe with n=400000 rows. I don't know how to send nrow/ncluster data for each cluster in one step, i = ?
I tried with isplitRows from library(itertools) without success.
我有这段代码可以并行编写我的结果。我在 R 中使用foreach和doParallel库。
output_location='/home/Desktop/pp/'
library(foreach)
library(doParallel)
library(data.table)
no_cores <- detectCores()
registerDoParallel(makeCluster(no_cores))
a=Sys.time()
foreach(i=1:100,.packages = c('foreach','doParallel')
,.options.multicore=mcoptions)%dopar%
{result<- my_functon(arg1,arg2)
write(result,file=paste(output_location,"out",toString(i),".csv"))
gc()
}
Run Code Online (Sandbox Code Playgroud)
现在它在 CPU 中使用 4 个内核,因此使用此代码编写所需的时间非常少。但我想要使用 GPU 进行 foreach-doparallel。是否有任何方法可以在 GPU 上处理foreach doParallel循环。gputools,gpuR是一些支持 R 的 GPU 包。但它们主要用于数学计算,如 gpuMatMult()、gpuMatrix() 等。我正在寻找在 GPU 上运行循环。任何帮助或指导都会很棒。
我有一个包含 4500 行的输入 csv 文件。每一行都有一个唯一的 ID,对于每一行,我必须读取一些数据,进行一些计算,并将输出写入一个 csv 文件,以便在我的输出目录中写入 4500 个 csv 文件。一个单独的输出 csv 文件包含一行 8 列的数据由于我必须对输入 csv 的每一行执行相同的计算,我想我可以使用foreach. 以下是逻辑的整体结构
library(doSNOW)
library(foreach)
library(data.table)
input_csv <- fread('inputFile.csv'))
# to track the progres of the loop
iterations <- nrow(input_csv)
pb <- txtProgressBar(max = iterations, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
myClusters <- makeCluster(6)
registerDoSNOW(myClusters)
results <-
foreach(i = 1:nrow(input_csv),
.packages = c("myCustomPkg","dplyr","arrow","zoo","data.table","rlist","stringr"),
.errorhandling = 'remove',
.options.snow = opts) %dopar%
{
rowRef <- input_csv[i, ] …Run Code Online (Sandbox Code Playgroud) 我读过在 R 中执行嵌套 foreach 循环的正确方法是通过嵌套运算符%:%(例如https://cran.r-project.org/web/packages/foreach/vignettes/nested.html)。
但是,使用这种方法时,不能在内循环和外循环之间添加代码——请参见下面的示例。
有没有办法创建嵌套的、并行的 foreach 循环,以便可以在内循环和外循环之间添加代码?
更一般地说,我想到的显而易见的方法有什么问题,即简单地用%dopar%运算符而不是%:%运算符嵌套两个 foreach 循环?请参阅下面的简单示例。
library(foreach)
# Set up backend
cl = makeCluster(6)
registerDoParallel(cl)
on.exit(stopCluster(cl))
# Run nested loop with '%:%' operator. Breaks if adding code between the inner and outer loops
foreach(i=1:2) %:%
# a = 1 #trivial example of running code between outer and inner loop -- throws error
foreach(j = 1:3) %dopar% {
i * j
}
# Run nested loop using …Run Code Online (Sandbox Code Playgroud) 我有 10 个非常大的 CSV 文件(可能有也可能没有相同的标题),我正在使用“readr”包 read_csv_chunked() 连续读取和处理这些文件。目前,我可以使用 10 个内核并行读取 10 个文件。该过程仍需要一个小时。我有128个核心。我可以将每个 CSV 分成 10 个块,以便对每个文件并行处理,从而利用 100 个核心吗?这是我目前拥有的(创建两个示例文件仅用于测试):
library(doParallel)
library(foreach)
# Create a list of two sample CSV files and a filter by file
df_1 <- data.frame(matrix(sample(1:300), ncol = 3))
df_2 <- data.frame(matrix(sample(1:200), ncol = 4))
filter_by_df <- data.frame(X1 = 1:100)
write.csv(df_1, "df_1.csv", row.names = FALSE)
write.csv(df_2, "df_2.csv", row.names = FALSE)
files <- c("df_1.csv", "df_2.csv")
# Create a function to read and filter each file in chunks
my_function <-
function(file) { …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
library(doParallel)
registerDoParallel(cores = 8)
result = foreach(A = c(1, 2, 3),B = c(10, 20), .combine = list) %dopar% {
A*B
}
Run Code Online (Sandbox Code Playgroud)
结果
[[1]]
[1] 10
[[2]]
[1] 40
Run Code Online (Sandbox Code Playgroud)
但我想要:10、20、30、20、40、60
在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.
我试图使用doParallel后端在并行foreach循环中使用标准的R闪亮进度条.但是,这会导致以下错误消息:
警告:{:任务1失败 - "'会话'不是ShinySession对象时出错."
library(shiny)
library(doParallel)
ui <- fluidPage(
actionButton(inputId = "go", label = "Launch calculation")
)
server <- function(input, output, session) {
workers=makeCluster(2)
registerDoParallel(workers)
observeEvent(input$go, {
Runs=c(1:4)
Test_out=foreach(i=Runs, .combine=cbind, .inorder=TRUE, .packages=c("shiny"),.export=c("session")) %dopar% {
pbShiny = shiny::Progress$new()
pbShiny <- Progress$new(session,min = 0, max = 10)
on.exit(pbShiny$close())
test_vec=rep(0,100)
for(i in 1:10){
test_vec=test_vec+rnorm(100)
pbShiny$set(message="Simulating",detail=paste(i),
value=i)
Sys.sleep(0.2)
}
}
})
}
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
如果我按顺序运行foreach循环(使用registerDoSEQ()),代码就会运行.有谁知道如何解决这个问题?
在以下链接下有一个类似的问题,但由于没有提供工作示例,因此没有得到解决:
我有一个基于 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 中使用 foreach 循环时遇到此错误:“{ 中的错误:任务 1 失败 - “NULL 值作为符号地址传递”。
我几乎不可能生成一个小的、可重复的示例(我已经尝试过!),因为我试图从巨大的栅格中提取数据并从该数据创建 csv 文件。但是,这是我的代码。
bi_2021 <- rast('G:\\GridMet_Yearly\\bi_2021.nc')
cl <- makeCluster(2)
registerDoParallel(cl)
r = 1
foreach (r=1:10, .packages = c('tidyverse','lubridate')) %dopar% {
rc <- row_char[r]
cc <- col_char[r]
ce <- cell_char[r]
rn <- row_num[r]
cn <- col_num[r]
fname <- paste0('G:/GridMet_Cells_RawData/row',rc,'_col',cc,'_cell',ce,'.csv')
data_df <- data.frame(read_csv(fname, show_col_types = FALSE)) # read previous data in
data_df <- data[which(year(data$Date) < 2021),]
# add rows for 2021 daily data
data_df[15342:15673,] <- NA
data_df$Date[15342:15673] <- seq(as.Date('2021-01-01'),as.Date('2021-11-28'),'days')
data_df$bi[15342:15673] <- …Run Code Online (Sandbox Code Playgroud) doparallel ×10
r ×10
foreach ×7
csv ×1
dataframe ×1
gpu ×1
progress-bar ×1
shiny ×1
split ×1
terra ×1