gpt4 book ai didi

r - 与 rJava 和 xlsx 并行使用

转载 作者:行者123 更新时间:2023-12-04 07:25:07 24 4
gpt4 key购买 nike

我有一个巨大的 excel 文件要操作。我需要读取大量单元格的颜色和样式,并认为通过并行化任务来加速计算。我依赖 xlsx包及其功能 getCellStyle逐个单元格抓取样式。反过来,该软件包依赖于 rJava .看起来,出于某种原因,涉及 java 对象的任务无法并行化。这是一个可重现的示例:

require(xlsx)
require(writexl)
require(doParallel)
require(foreach)
require(parallel)

#We create an excel file with the iris dataset
filename <- "iris.xlsx"
write_xlsx(iris, filename)
#Read the workbook and the first (and only) sheet
wb <- loadWorkbook(filename)
sheet <- getSheets(wb)[[1]]
#With the next two rows we grab all the cells as Java objects
rows <- getRows(sheet)
allcells <- getCells(rows)
#This works: grabbing the style
styles <- lapply(allcells, getCellStyle)
styles[[1]]
#[1] "Java-Object{org.apache.poi.xssf.usermodel.XSSFCellStyle@abd07bb0}"

#Now we try to go parallel: we create a cluster and make
#use of foreach and dopar
registerDoParallel(6)
stylePar<-foreach(i = seq_along(allcells)) %dopar% getCellStyle(allcells[[i]])
#Unfortunately, every Java object looks null
stylePar[[1]]
#[1] "Java-Object<null>"
#For the record, even mclapply returns all Java null objects
#mclapply(allcells, getCellStyle, mc.cores = 6, mc.preschedule = FALSE)
我是不是遗漏了什么,或者它本质上是不可能使用的 foreach使用 Java 对象?考虑到我只是在读取值而不是设置它们。

最佳答案

由于其他解决方案没有指出这一点,我们必须声明这是不可能的。
我在 R 邮件列表中找到了 8 年前的相同主题。
https://stat.ethz.ch/pipermail/r-devel/2013-November/067960.html
“这是 Java 运行时的一个限制——你不能 fork JVM。”
其他来源:how to fork JVM?
所以这不是 R 的限制,更多的是 JVM。
library(future.apply)下的解决方案正在工作,因为任何计划都被激活,所以基础 lapply被使用。应该像这样调用:

library(future)
library(future.apply)
plan(multisession)
最后要评论的是,多处理并不是那么简单,可以在不同的范式下工作。请查看 future 小插图 https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html .您可以找到同步和异步处理。不仅如此,每个人都有自己的区别。对我来说重要的是要记住我们有 multisessionmulticore ( multithreating ) 的工作方式大不相同。

关于r - 与 rJava 和 xlsx 并行使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68256836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com