Импортировать большой файл xlsx в R?
Мне интересно, если кто-нибудь знает способ импорта данных из "большого" файла xlsx (~20 МБ). Я пытался использовать библиотеки xlsx и XLConnect. К сожалению, оба используют rJava, и я всегда получаю одну и ту же ошибку:
> library(XLConnect)
> wb <- loadWorkbook("MyBigFile.xlsx")
Error: OutOfMemoryError (Java): Java heap space
или же
> library(xlsx)
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, :
java.lang.OutOfMemoryError: Java heap space
Я также пытался изменить параметры java.parameters перед загрузкой rJava:
> options( java.parameters = "-Xmx2500m")
> library(xlsx) # load rJava
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, :
java.lang.OutOfMemoryError: Java heap space
или после загрузки rJava (это немного глупо, я думаю):
> library(xlsx) # load rJava
> options( java.parameters = "-Xmx2500m")
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, :
java.lang.OutOfMemoryError: Java heap space
Но ничего не работает. У кого-нибудь есть идея?
8 ответов
Я наткнулся на этот вопрос, когда кто-то отправил мне (еще один) файл Excel для анализа. Этот даже не такой большой, но по какой-то причине я столкнулся с подобной ошибкой:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Основываясь на комментарии @Dirk Eddelbuettel в предыдущем ответе, я установил пакет openxlsx ( http://cran.r-project.org/web/packages/openxlsx/). а затем побежал:
library("openxlsx")
mydf <- read.xlsx("BigExcelFile.xlsx", sheet = 1, startRow = 2, colNames = TRUE)
Это было именно то, что я искал. Простой в использовании и быстро злой. Это мой новый лучший друг. Спасибо за подсказку @Dirk E!
Кстати, я не хочу переманивать этот ответ от Дирка Е, поэтому, если он отправит ответ, пожалуйста, примите его, а не мой!
options(java.parameters = "-Xmx2048m") ## memory set to 2 GB
library(XLConnect)
Разрешить больше памяти, используя "параметры", прежде чем загружать любой компонент Java. Затем загрузите библиотеку XLConnect (она использует Java).
Вот и все. Начните читать данные с readWorksheet .... и так далее.:)
Я согласен с ответом @orville Джексона, и он мне тоже очень помог.
Подчеркните ответ, предоставленный @orville Джексоном. Вот подробное описание того, как вы можете использовать openxlsx для чтения и записи больших файлов.
Когда размер данных невелик, R имеет много пакетов и функций, которые могут быть использованы в соответствии с вашими требованиями.
write.xlsx, write.xlsx2, XLconnect также делают эту работу, но иногда они медленнее, чем openxlsx.
Итак, если вы имеете дело с большими наборами данных и столкнулись с ошибками Java. Я бы посоветовал взглянуть на "openxlsx", который действительно потрясающий и сократить время на 1/12.
Я проверил все и, наконец, я был действительно впечатлен производительностью возможностей openxlsx.
Вот шаги для записи нескольких наборов данных на несколько листов.
install.packages("openxlsx")
library("openxlsx")
start.time <- Sys.time()
# Creating large data frame
x <- as.data.frame(matrix(1:4000000,200000,20))
y <- as.data.frame(matrix(1:4000000,200000,20))
z <- as.data.frame(matrix(1:4000000,200000,20))
# Creating a workbook
wb <- createWorkbook("Example.xlsx")
Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") ## path to zip.exe
Sys.setenv ("R_ZIPCMD" = "C: /Rtools/bin/zip.exe") должен быть статическим, поскольку он использует ссылку на некоторую утилиту из Rtools.
Примечание: Incase Rtools не установлен в вашей системе, пожалуйста, сначала установите его для бесперебойной работы. вот ссылка для вашей ссылки: (выберите подходящую версию) https://cran.r-project.org/bin/windows/Rtools/
проверьте параметры по ссылке ниже (необходимо установить все флажки во время установки) https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png
# Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name
addWorksheet(wb, "Sheet 1")
addWorksheet(wb, "Sheet 2")
addWorksheet(wb, "Sheet 3")
# Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name
writeData(wb, 1, x)
# incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function.
writeData(wb, 2, x = y, withFilter = TRUE)
## Similarly writeDataTable is another way for representing your data with table formatting:
writeDataTable(wb, 3, z)
saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE)
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Пакет openxlsx действительно хорош для чтения и записи огромных данных из / в файлах Excel и имеет множество опций для пользовательского форматирования в Excel.
Интересным фактом является то, что нам не нужно беспокоиться о памяти кучи Java здесь.
Я знаю, что этот вопрос немного устарел, но сейчас есть хорошее решение для этого. Это пакет по умолчанию, когда вы пытаетесь импортировать Excel в Rstudio с графическим интерфейсом, и он хорошо работает в моей ситуации.
library(readxl)
data <- read_excel(filename)
Как упоминалось в каноническом вопросе Excel->R, недавно появившаяся альтернатива возникла из readxl
пакет, который я нашел довольно быстро, по сравнению, например, с openxlsx
а также xlsx
,
Тем не менее, существует определенный предел размера таблицы, который вы, вероятно, лучше просто сохранить в виде .csv
и используя fread
,
У меня тоже была одинаковая ошибка в обоих xlsx::read.xlsx
а также XLConnect::readWorksheetFromFile
, Может быть, вы можете использовать RODBC::odbcDriverConnect
а также RODBC::sqlFetch
, который использует Microsoft RODBC, который является гораздо более эффективным.
Предложение @flodel о переходе на CSV кажется самым простым. Если по какой-либо причине это не вариант, вы можете прочитать в файле кусками:
require(XLConnect)
chnksz <- 2e3
s <- <sheet>
wb <- loadWorkbook(<file>, s)
tot.rows <- getLastRow(wb)
last.row =0
for (i in seq(ceiling( tot.rows / chnksz) )) {
next.batch <- readWorksheet(wb, s, startRow=last.row+i, endRow=last.row+chnksz+i)
# optionally save next.batch to disk or
# assign it to a list. See which works for you.
}
Я нашел эту ветку в поисках ответа на точно такой же вопрос. Вместо того, чтобы пытаться взломать файл xlsx изнутри R, у меня получилось преобразовать файл в.csv с помощью python, а затем импортировать файл в R с помощью стандартной функции сканирования.
Проверьте: https://github.com/dilshod/xlsx2csv