1

我正在尝试使用来自kaggle reddit 评论挑战的数据创建一个手套模型。我加载表格,拉动身体,现在我正在尝试清理文本。

我提取了一个小子集(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。

编辑:我环顾四周,找到了这样这样的答案,但他们没有帮助我。此外,如果我只使用 lapply,它似乎也有效。

4

2 回答 2

1

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

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

于 2019-02-21T05:15:08.003 回答
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)
}
于 2019-02-21T05:05:18.233 回答