Импорт большого файла 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
Но ничего не работает. У кого-нибудь есть идея?
Ответы
Ответ 1
Я наткнулся на этот вопрос, когда кто-то прислал мне (еще один) файл 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)
Это было то, что я искал. Прост в использовании и злой быстро. Это мой новый BFF. Спасибо за подсказку @Dirk E!
Кстати, я не хочу браковать этот ответ от Dirk E, поэтому, если он отправит ответ, пожалуйста, примите его, а не мой!
Ответ 2
options(java.parameters = "-Xmx2048m") ## memory set to 2 GB
library(XLConnect)
разрешить большую память с помощью "параметров" до загрузки любого компонента java. Затем загрузите библиотеку XLConnect (она использует java).
Что это. Начните читать данные с помощью readWorksheet.... и так далее.
:)
Ответ 3
Я также имел ту же ошибку как в xlsx::read.xlsx
, так и в XLConnect::readWorksheetFromFile
. Возможно, вы можете использовать RODBC::odbcDriverConnect
и RODBC::sqlFetch
, который использует Microsoft RODBC, что намного эффективнее.
Ответ 4
Как упоминалось в каноническом вопросе Excel- > R, недавняя альтернатива, которая появилась, исходит из пакета readxl
, который Я нашел довольно быстро, по сравнению с, например, openxlsx
и xlsx
.
Тем не менее, существует определенный предел размера электронной таблицы, из-за которого вам, вероятно, лучше всего сохранить вещь как .csv
и используя fread
.
Ответ 5
Я согласен с ответом @orville Jackson, и это действительно помогло мне.
Встройте ответ, предоставленный @orville jackson. вот подробное описание того, как вы можете использовать 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 здесь.
Ответ 6
@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.
}
Ответ 7
Я нашел эту нить, ища ответ на тот же самый вопрос. Вместо того, чтобы пытаться взломать xlsx файл из R, в итоге мне пришлось преобразовать файл в .csv с помощью python, а затем импортировать файл в R, используя стандартную функцию сканирования.
Отъезд: https://github.com/dilshod/xlsx2csv