Пакет xlsx
может использоваться для чтения и записи таблиц Excel из R. К сожалению, даже для умеренно больших таблиц может возникнуть java.lang.OutOfMemoryError
. В частности,
## Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, :
## java.lang.OutOfMemoryError: Java heap space
## Error in .jcall("RJavaTools", "Ljava/lang/Object;", "newInstance", .jfindClass(class), :
## java.lang.OutOfMemoryError: GC overhead limit exceeded
(Другие связанные исключения также возможны, но реже.)
Аналогичный вопрос был задан относительно этой ошибки при чтении электронных таблиц.
Импорт большого файла 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
?