标签: doparallel

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

R:Render_site不与Dopar合作

我使用foreach的dopar来解决Render_site的问题.使用简单的代码完美地运行代码.虽然我在使用dopar时遇到问题,因为在YAML文件中使用dopar之后输出会重复.

请注意,如果我使用Render而不是Render_site,则dopar可以正常工作.

您可以在下面看到我的代码:

pacman::p_load(data.table)
pacman::p_load(data.table,rmarkdown)
pacman::p_load(rmarkdown,knitr,kableExtra,dplyr)

info.rmd=readLines("test.rmd",encoding = "UTF-8")
yml=readLines("site.yml",encoding = "UTF-8")

fun<-function(r){
 out <- file( description=paste0(r,"test_.Rmd"), open="w", encoding="UTF-8") 
 write(info.rmd,file=out )
 close(con=out)
 render_site(paste0(r,"test_.Rmd"),encoding = "UTF-8",quiet = T)
 file.remove(paste0(r,"test_.Rmd"))
}
Run Code Online (Sandbox Code Playgroud)

该功能正在为简单而工作

# Working with for

for (r in 1:10){
 fun(r)

}
Run Code Online (Sandbox Code Playgroud)

我有使用dopar的问题(在这种情况下在YAML文件中重复输出)

# Not working for dopar
library(doParallel)
no_cores<-3
cl <- makeCluster(no_cores, type="SOCK")
registerDoParallel(cl)

res<-foreach (r=1:10,.combine = c,.inorder = T) %dopar% {
 library(rmarkdown)
 fun(r)
}
print(ret)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

回溯消息如下:

Error in { : task 10 failed - "Duplicate map key: 'output'"
4.stop(simpleError(msg, …
Run Code Online (Sandbox Code Playgroud)

parallel-processing yaml r r-markdown doparallel

7
推荐指数
0
解决办法
173
查看次数

每次我想在 R 中使用 foreach() 时,是否都必须注册DoParallel() 和 stopCluster() ?

我读到您必须stopCluster()在运行并行函数后使用:foreach()在 R 中。但是,我可以逃脱registerDoParallel(),然后运行foreach()任意多次,而无需使用stopCluster()。那我到底需要stopCluster()还是不需要?

不使用是否stopCluster()意味着您的核心正在忙于当前的任务?因此,如果我使用并行编程,中间只执行一点点单核顺序任务,那么我就不需要这样做stopCluster()?据我所知,设置并行也会产生大量的开销时间消耗。

parallel-processing r doparallel

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

一旦使用doParallel clusterEvalQ启动RPostgreSQL连接就会过期

我正在尝试设置并行任务,每个工作人员都需要进行数据库查询.我正在尝试使用这个问题中的连接设置每个工作者,但每次我尝试它都会返回<Expired PostgreSQLConnection:(2781,0)>我注册的许多工作人员.

这是我的代码:

cl <- makeCluster(detectCores())
registerDoParallel(cl)

clusterEvalQ(cl, {
  library(RPostgreSQL)
  drv<-dbDriver("PostgreSQL")
  con<-dbConnect(drv, user="user", password="password", dbname="ISO",host="localhost")

})
Run Code Online (Sandbox Code Playgroud)

如果我尝试运行我foreach尽管错误,它失败了task 1 failed - "expired PostgreSQLConnection"

当我进入postgres服务器状态时,它会显示已创建的所有活动会话.

我从主R实例中与postgres交互没有任何问题.

如果我跑

clusterEvalQ(cl, {
  library(RPostgreSQL)
  drv<-dbDriver("PostgreSQL")
  con<-dbConnect(drv, user="user", password="password", dbname="ISO",host="localhost")
  dbGetQuery(con, "select inet_client_port()")

})
Run Code Online (Sandbox Code Playgroud)

然后它将返回所有客户端端口.它没有给我过期通知但是如果我尝试运行我的foreach命令它将失败并出现相同的错误.

编辑:

我在Ubuntu和2台Windows电脑上试过这个,它们都给出了同样的错误.

另一个编辑:

现在3台Windows电脑

foreach r rpostgresql doparallel

6
推荐指数
1
解决办法
1579
查看次数

R:在foreach%dopar%中显示错误和警告消息

我是使用foreach()%dopar%进行并行的新手,我对如何处理错误或警告有一些问题.

  1. 当我在foreach()%dopar%中使用try()和我自定义的错误消息时,"本机"错误消息不会显示:

    test <- function(x) {
      if (x==2) "a"/2
    }
    
    foreach(i=1:3) %dopar% {
      tryout <- try(test(i))
      if (class(tryout)=="try-error") print("Error!")
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,"本机"错误消息:Error in "a"/2 : non-numeric argument to binary operator不会显示,只会Error!打印来自try()错误捕获.但是,当不使用foreach()%dopar%时,将打印这两个错误消息.那么如何让两个错误信息都显示出来?

  2. 在上述情况下,当有警告时,无论是否有错误,都不会打印警告消息,例如使用与上面和test()下面相同的foreach()块:

    test <- function(x) {
      if (x==2) warning("Warning!")
    }
    
    Run Code Online (Sandbox Code Playgroud)

    那么如何显示警告?

ps我发现,如果我只是在%dopar%内使用try(test(i)),那么将打印"本机"错误消息和警告,但我确实想在现实生活中包含我自己的错误消息.我也尝试使用tryCatch()而不是try(),但它没有解决问题.

谢谢!

error-handling foreach warnings r doparallel

6
推荐指数
1
解决办法
2597
查看次数

并行运行多个 R 函数

我有一个包含很少数字列和超过 1 亿行的数据集作为 data.table 对象。我想根据其他列对某些列进行分组操作。例如,计算列“d”中每个类别的“a”列的唯一元素。

my_data[, a_count := uniqueN(col_a), col_d]
Run Code Online (Sandbox Code Playgroud)

我有许多这样的操作,它们彼此独立,并行运行它们会很棒。我发现以下代码可以并行运行不同的功能。

fun1 = function(x){
  x[, a_count := uniqueN(col_a), col_d]
  return(x[, .(callId, a_count)])
}
fun2 = function(x){
  x[, b_count := uniqueN(col_b), col_d]
  return(x[, .(callId, b_count)])
}
fun3 = function(x){
  x[, c_count := uniqueN(col_c), col_d]
  return(x[, .(callId, c_count)])
}

tasks = list(job1 = function(x) fun1(x),
             job2 = function(x) fun2(x),
             job3 = function(x) fun3(x))

cl = makeCluster(3)
clusterExport(cl, c('fun1', 'fun2', 'fun3', 'my_data', 'data.table', 'uniqueN'))

out = clusterApply( 
  cl,
  tasks,
  function(f) f(my_data)
)
stopCluster(cl) …
Run Code Online (Sandbox Code Playgroud)

foreach r data.table doparallel

6
推荐指数
0
解决办法
827
查看次数

使用 doParallel 在 R 中并行化 keras 模型

我正在尝试使用 keras for R 集成多个神经网络。为此,我想通过使用“foreach”循环来并行化不同网络的训练。

models <- list()
x_bagged <- list()
y_bagged <- list()

n_nets = 2
bag_frac <-0.7
len <- nrow(x_train)

for(i in 1:n_nets){
    sam <- sample(len, floor(bag_frac*len), replace=FALSE)
    x_bagged[[i]] <- x_train[sam,]
    y_bagged[[i]] <- y_train[sam]

    models[[i]] <- keras_model_sequential() 

models[[i]] %>% 
  layer_dense(units = 100, input_shape = ncol(x_train), activation = "relu", kernel_initializer = 'glorot_normal') %>% 
  layer_batch_normalization() %>%
  layer_dense(units = 100, activation = custom_activation, kernel_initializer = 'glorot_normal') %>%
  layer_dense(units = 1, activation = 'linear', kernel_initializer = 'glorot_normal')


    models[[i]] %>% compile( …
Run Code Online (Sandbox Code Playgroud)

foreach r doparallel keras tensorflow

6
推荐指数
1
解决办法
971
查看次数

Create_Matrix'RTextTools'包的并行计算

我正在创建一个DocumentTermMatrix使用create_matrix()RTextTools创建containermodel基于它.它适用于极大的数据集.

我为每个类别(因子级别)执行此操作.因此,对于每个类别,它必须运行矩阵,容器和模型.当我运行下面的代码(例如16核/ 64 GB)时 - 它只在一个核心中运行,并且使用的内存小于10%.

有没有办法加快这个过程?也许用doparallel&foreach?任何信息肯定会有所帮助.

#import the required libraries
library("RTextTools")
library("hash")
library(tm)

for ( n in 1:length(folderaddress)){
    #Initialize the variables
    traindata = list()
    matrix = list()
    container = list()
    models = list()
    trainingdata = list()
    results = list()
    classifiermodeldiv = 0.80`

    #Create the directory to place the models and the output files
    pradd = paste(combinedmodelsaveaddress[n],"SelftestClassifierModels",sep="")
    if (!file.exists(pradd)){
        dir.create(file.path(pradd))
    }  
    Data$CATEGORY <- as.factor(Data$CATEGORY)

    #Read the …
Run Code Online (Sandbox Code Playgroud)

parallel-processing foreach text-processing r doparallel

6
推荐指数
1
解决办法
208
查看次数

是什么触发了“祖先必须是环境”错误?

我正在运行并行计算,用于foreach同时处理大量时间序列。在这些计算中(在一个名为我的函数中,compute_slope()我做了这样的事情

\n
lBd <- floor(TMax^delta) # lower bound\nuBd <-  ceiling(m * TMax^delta) # upper bound\n    \n# process is a tibble with columns `n` and `variance`\nprocess %>% \n  dplyr::filter(between(n, lBd, uBd)) %>% \n  lm(data = ., log(variance) ~ log(n)) %>% \n  coefficients() %>% \n  .[2]\n
Run Code Online (Sandbox Code Playgroud)\n

所以,这是非常简单的事情:使用参数TMaxdeltam在左侧和右侧截断时间序列(使用filter()),然后对截断的时间序列运行线性回归。\n出于某种奇怪的原因,大多数时候一切都很顺利,但有时(我怀疑在较长的时间序列中更有可能发生错误,即TMax较大,但这也有点不规则)我得到

\n
\xe2\x9c\x96 Problem with `filter()` input `..1`.\n\xe2\x84\xb9 Input `..1` is `between(n, lBd, uBd)`.\n\xe2\x9c\x96 `ancestor` must be an environment"\n
Run Code Online (Sandbox Code Playgroud)\n

我真的不知道如何解释这个错误。我也很难复制这个“祖先”错误,但到目前为止还没有运气。例如,我尝试过 …

r dplyr doparallel

6
推荐指数
1
解决办法
435
查看次数

R:使用 xml2、doParallel 和 foreach 并行读取 xml 文件

目前我正在开发一个小型 R 项目,从 Word 文件中读取一些信息。由于这些是底层的压缩 xml 文件,我认为使用 R 来完成这个任务会非常容易。我的脚本基本上可以工作,但我想提高它的速度,所以我查看了 和doParallelforeach

library(foreach)
library(doParallel)

cores <- detectCores()
cl <- makeCluster(cores - 1)
registerDoParallel(cl)


file_list <- list.files(path = "/path/to/word/files", pattern = glob2rx("*.docx"), ignore.case = TRUE, full.names = TRUE, recursive = TRUE)


final <- foreach(
  filename = file_list[1:4], .combine = rbind, .packages = c("stringr", "xml2", "tibble"),
  .verbose = T, .inorder = FALSE
) %dopar% {

  name <- str_extract(filename, "[0-9a-f]{40}")


  # doc <- read_xml(unzip(zipfile = filename,  files = c("word/document.xml")), encoding = …
Run Code Online (Sandbox Code Playgroud)

foreach r doparallel xml2

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