最佳答案
xlsx
软件包可以用来从 R 读写 Excel 电子表格。不幸的是,即使对于中等大小的电子表格,也可能出现 java.lang.OutOfMemoryError
。尤其是,
Jcall 中的错误(“ RJavaTools”,“ Ljava/lang/Object;”,“ invokeMethod”,cl,:
错误: Java 堆空间Jcall 中的错误(“ RJavaTools”,“ Ljava/lang/Object;”,“ newInstance”,. jfindClass (class) ,:
错误: 超出 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 内存的机器上以64位运行这个命令,第一次运行 addDataFrame
时会抛出 GC overhead limit exceeded
错误。
如何使用 xlsx
将大型数据集写入 Excel 电子表格?