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

dav*_*vid 5 foreach r doparallel xml2

目前我正在开发一个小型 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 = "utf-8")


  df <- tibble(
    Name = name,
  )

  df
}

stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

该脚本工作正常,但如果我取消注释包含该语句的行read_xml并启动脚本,我会收到不一致的错误,例如

Fehler in { : 任务 1 失败 - “开始和结束标记不匹配:pPrPr 第 2 行和 r [76]”

或者

Fehler in { : 任务 1 失败 - “规范要求属性 MERGEFORMAT 的值 [41]”

或者

Fehler in { : 任务 1 失败 - “文档末尾有额外内容 [5]”

因此,在并行环境中使用 xml2 包似乎不起作用。从 切换到%dopar%解决%do%了问题,但我失去了加速。

我知道 xml2 生成的指针在 R 的不同线程中无效,但我的想法是每个线程读取和处理一个 docx 文件。知道如何解决这个问题吗?