标签: doparallel

R: how to split dataframe in foreach %dopar%

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.

foreach split r dataframe doparallel

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

GPU 上的 foreach doparallel

我有这段代码可以并行编写我的结果。我在 R 中使用foreachdoParallel库。

    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 上运行循环。任何帮助或指导都会很棒。

foreach gpu r doparallel

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

对于 R 中的大型迭代,foreach 循环变为非活动状态

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

foreach r doparallel

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

如何在 R 中嵌套 foreach 循环的内循环和外循环之间添加代码

我读过在 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)

parallel-processing foreach r doparallel

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

如何使用 R 并行读取多个大块的 CSV?

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

csv parallel-processing r parallel.foreach doparallel

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

带两个参数的并行 foreach

我有这个代码:

  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

foreach r doparallel

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

来自包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
查看次数

在并行foreach计算中使用标准R闪亮进度条

我试图使用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()),代码就会运行.有谁知道如何解决这个问题?


总体的目标

  • 使用doParallel后端处于闪亮状态,在并行foreach循环中向用户显示进度
  • 用户应该了解工人的数量以及每个工人的进度和/或总体进度

在以下链接下有一个类似的问题,但由于没有提供工作示例,因此没有得到解决:

在R Shiny中利用并行foreach进度条

foreach r progress-bar shiny doparallel

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

在 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
查看次数

在 foreach 循环 R 中,NULL 值作为符号地址错误传递

我以前从未遇到过此问题,但是当我尝试在 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)

foreach r doparallel terra

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