Цей xlsx
пакет можна використовувати для читання та запису електронних таблиць Excel із R. На жаль, навіть для помірно великих електронних таблиць це java.lang.OutOfMemoryError
може статися. Зокрема,
Помилка в .jcall ("RJavaTools", "Ljava / lang / Object;", "invokeMethod", cl,:
java.lang.OutOfMemoryError: Java heap spaceПомилка .jcall ("RJavaTools", "Ljava / lang / Object;", "newInstance", .jfindClass (клас),:
java.lang.OutOfMemoryError: перевищено ліміт накладних витрат GC
(Інші пов’язані винятки також можливі, але рідше.)
Подібне запитання було задано щодо цієї помилки під час читання електронних таблиць.
Імпортувати великий файл xlsx у R?
Основною перевагою використання електронних таблиць Excel як носія даних над CSV є те, що ви можете зберігати кілька аркушів в одному файлі, тому тут ми розглядаємо список кадрів даних, які слід записати по одному кадру даних на робочий аркуш. Цей приклад набору даних містить 40 кадрів даних, кожен із двох стовпців до 200 тис. Рядків. Він розроблений для того, щоб бути досить великим, щоб бути проблематичним, але ви можете змінити розмір, змінивши 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")
Запустивши це в 64-розрядному верстаті на машині з 8 ГБ оперативної пам'яті, він видає GC overhead limit exceeded
помилку під addDataFrame
час першого запуску .
Як записати великі набори даних у електронні таблиці Excel за допомогою xlsx
?
xlsx
пакет наopenxlsx
пакет, який залежить,Rcpp
а не від Java.