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.readxl
еще одна новая альтернатива C / C ++, которая выглядит многообещающей.options(java.parameters = "-Xmx8000m")
перед тем нагрузкойrJava
,xlsxjars
,xlsx
решенаError in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException Calls: getNetwork ... <Anonymous> -> .jrcall -> .jcall -> .jcheck -> .Call Execution halted
в RHEL 6.3 x86_64, Java 1.7.0_79 (Oracle), rJava_0.9-7, xlsxjars_0.6.0, xlsx_0.5.7Опираясь на @ Richie хлопка-ответ, я обнаружил , добавив
gc()
кjgc
функции сохранили низкий уровень загрузки процессора.jgc <- function() { gc() .jcall("java/lang/System", method = "gc") }
Мой предыдущий
for
цикл все еще боролся с исходнойjgc
функцией, но с дополнительной командой я больше не сталкивался сGC overhead limit exceeded
сообщением об ошибке.источник
Вы также можете использовать gc () внутри цикла, если вы пишете строка за строкой. gc () означает сборку мусора. gc () можно использовать в любом случае проблемы с памятью.
источник
Решение вышеуказанной ошибки: используйте указанный ниже r-код:
И попробуйте импортировать файл еще раз, и вы не получите никаких ошибок, так как у меня это работает.
источник
У меня были проблемы с write.xlsx (), а не с чтением .... но потом я понял, что случайно запустил 32-битный R. Замена его на 64-битный устранила проблему.
источник