【发布时间】:2014-03-23 03:46:12
【问题描述】:
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 开销限制
(其他相关的例外也是可能的,但比较少见。)
在阅读电子表格时,有人就这个错误提出了类似的问题。
Importing a big xlsx file into R?
与 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 位运行它,它在第一次运行 addDataFrame 时抛出 GC overhead limit exceeded 错误。
如何使用xlsx 将大型数据集写入 Excel 电子表格?
【问题讨论】: