xlsx
Пакет может быть использован для чтения и записи таблицы Excel от R. К сожалению, даже для умеренно больших таблиц, java.lang.OutOfMemoryError
может произойти. В частности,
Ошибка в .jcall ("RJavaTools", "Ljava / lang / Object;", "invokeMethod", cl,:
java.lang.OutOfMemoryError: пространство кучи JavaОшибка в .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.