Импорт большого файла 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