背靠背使用多个实例时,mclapply挂起

时间:2019-02-21 04:44:15

标签: r macos memory parallel-processing mclapply

我正在尝试使用kaggle reddit comments challenge中的数据创建一个手套模型。我加载桌子,拉动身体,现在我正尝试清洁文本。

我抽出一小部分(100000个标题)进行试验,这是我到目前为止的结果:

library(DBI)
require(RSQLite)
library(dplyr)
library(parallel)
library(progress)
library(textclean)

titles = as.character(df$body)
numcores = detectCores()

i = 1
temp = {}
out = {}
while(i <= 100000){
  temp = titles[i:(i+1000)] %>%
    mclapply(replace_emoji, mc.cores = numcores) %>%
    mclapply(replace_url, mc.cores = numcores) %>%
    mclapply(replace_contraction, mc.cores = numcores) %>%
    mclapply(gsub, pattern = "[^[:alnum:][:space:]]",replacement = "") %>% 
    mclapply(replace_number, mc.cores = numcores) 
  i = i+1000
  out = c(out, temp)
  print(i)
}

但它似乎押在随机的地方。它不会导致错误,只会停止。当我查看活动监视器时,我发现CPU使用率只是下降而从未恢复。

我不知道需要提供什么以使该请求更易于分解,所以请告诉我,我将对其进行编辑。

我使用mclapply错误吗?

我使用具有8个内核的mac 16 GB i7。

编辑:我环顾四周,发现了诸如thisthis之类的答案,但它们并没有帮助我。 另外,如果我只使用lapply,它似乎也可以工作。

2 个答案:

答案 0 :(得分:1)

嵌套循环导致了问题。并行循环的一个重复不应等待另一循环的重复进行。如果确定并行循环被顺序重复,则会发生死锁。

并行工作并不总是能产生良好的效率。

答案 1 :(得分:0)

如果我不使用mclapply在它们之间背靠背堆叠它们,而是创建一个新函数并一次使用mclapply,这似乎是可行的。

cleaner = function(vec){
 vec %>%
    replace_emoji() %>%
    replace_url() %>%
    replace_contraction() %>%
    Num_Al_sep() %>%
    gsub(pattern = "[^[:alnum:][:space:]]", replacement = "") %>%
    replace_number()
}

i = 1
temp = {}
out = {}
while(i <= 100000){
  temp = titles[i:(i+1000)] %>%
    mclapply(cleaner) 
  i = i+1000
  out = c(out, temp)
  #pb$tick()
  print(i)
}