该xlsx
软件包可用于读取和写入R中的Excel电子表格。不幸的是,即使对于中等大小的电子表格,java.lang.OutOfMemoryError
也可能会发生。尤其是,
.jcall(“ RJavaTools”,“ Ljava / lang / Object;”,“ invokeMethod”,cl,中的错误:
java.lang.OutOfMemoryError:Java堆空间.jcall(“ RJavaTools”,“ Ljava / lang / Object;”,“ newInstance”,.jfindClass(class),中的错误:
java.lang.OutOfMemoryError:超出了GC开销限制
(其他相关例外也是可能的,但很少见。)
在读取电子表格时,针对此错误提出了类似的问题。
与CSV相比,使用Excel电子表格作为数据存储介质的主要优点是可以将多个工作表存储在同一个文件中,因此在这里我们考虑将一个数据帧列表写入每个工作表一个数据帧。此示例数据集包含40个数据帧,每个数据帧包含两列,每行最多200k行。它的大小设计得足以出现问题,但是您可以通过更改n_sheets
和来更改大小n_rows
。
library(xlsx)
set.seed(19790801)
n_sheets <- 40
the_data <- replicate(
n_sheets,
{
n_rows <- sample(2e5, 1)
data.frame(
x = runif(n_rows),
y = sample(letters, n_rows, replace = TRUE)
)
},
simplify = FALSE
)
names(the_data) <- paste("Sheet", seq_len(n_sheets))
将其写入文件的自然方法是使用创建工作簿createWorkbook
,然后循环调用createSheet
和调用每个数据帧addDataFrame
。最后,可以使用将工作簿写入文件saveWorkbook
。我已将消息添加到循环中,以使其更容易查看掉落的位置。
wb <- createWorkbook()
for(i in seq_along(the_data))
{
message("Creating sheet", i)
sheet <- createSheet(wb, sheetName = names(the_data)[i])
message("Adding data frame", i)
addDataFrame(the_data[[i]], sheet)
}
saveWorkbook(wb, "test.xlsx")
在具有8GB RAM的计算机上以64位运行此命令,则在首次GC overhead limit exceeded
运行时会引发错误addDataFrame
。
如何使用将大型数据集写入Excel电子表格xlsx
?
xlsx
软件包替换openxlsx
为依赖于Rcpp
Java而不是Java的软件包来回避整个问题。