web-dev-qa-db-fra.com

Importer un gros fichier xlsx dans R?

Je me demande si quelqu'un connaît un moyen d'importer des données à partir d'un "gros" fichier xlsx (~ 20 Mo). J'ai essayé d'utiliser les bibliothèques xlsx et XLConnect. Malheureusement, les deux utilisent rJava et j'obtiens toujours la même erreur:

> library(XLConnect)
> wb <- loadWorkbook("MyBigFile.xlsx")
Error: OutOfMemoryError (Java): Java heap space

ou

> library(xlsx)
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
   Java.lang.OutOfMemoryError: Java heap space

J'ai aussi essayé de modifier Java.parameters avant de charger 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

ou après le chargement de rJava (c'est un peu stupide, je pense):

> 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

Mais rien ne fonctionne. est-ce que quelqu'un a une idée?

67
user2722443

Je suis tombé sur cette question lorsque quelqu'un m'a envoyé (encore un) fichier Excel à analyser. Celui-ci n'est même pas si gros, mais pour une raison quelconque, je rencontrais une erreur similaire:

Java.lang.OutOfMemoryError: GC overhead limit exceeded

Sur la base du commentaire de @Dirk Eddelbuettel dans une réponse précédente, j'ai installé le paquet openxlsx ( http://cran.r-project.org/web/packages/openxlsx/ ). et ensuite couru:

library("openxlsx")
mydf <- read.xlsx("BigExcelFile.xlsx", sheet = 1, startRow = 2, colNames = TRUE)

C'était juste ce que je cherchais. Facile à utiliser et rapide. C'est mon nouveau meilleur ami. Merci pour le conseil @Dirk E!

BTW, je ne veux pas casser cette réponse de Dirk E, donc s'il poste une réponse, veuillez l'accepter plutôt que la mienne!

125
orville jackson
options(Java.parameters = "-Xmx2048m")  ## memory set to 2 GB
library(XLConnect)

permettre plus de mémoire en utilisant "options" avant que tout composant Java soit chargé. Ensuite, chargez la bibliothèque XLConnect (il utilise Java).

C'est ça. Commencez à lire des données avec readWorksheet .... et ainsi de suite. :)

13
viquanto

Je suis d’accord avec la réponse de @orville jackson et cela m’a beaucoup aidé.

En ligne avec la réponse fournie par @orville jackson. Voici la description détaillée de la manière dont vous pouvez utiliser openxlsx pour lire et écrire de gros fichiers.

Lorsque la taille des données est petite, R propose de nombreux packages et fonctions pouvant être utilisés selon vos besoins.

write.xlsx, write.xlsx2, XLconnect effectuent également le travail, mais ils sont parfois lents par rapport à openxlsx.

Donc, si vous traitez avec des ensembles de données volumineux et que vous rencontrez des erreurs Java. Je vous conseillerais de jeter un coup d'oeil à "openxlsx" qui est vraiment génial et réduisez le temps par 1/12ème.

J'ai tout testé et finalement, j'ai été vraiment impressionné par les performances des fonctionnalités openxlsx.

Voici les étapes à suivre pour écrire plusieurs jeux de données dans plusieurs feuilles.

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") doit être statique car il prend en référence un utilitaire de Rtools.

Remarque: Incase Rtools n'est pas installé sur votre système. Veuillez d'abord l'installer pour une expérience fluide. voici le lien pour votre référence: (choisissez la version appropriée) https://cran.r-project.org/bin/windows/Rtools/

vérifiez les options selon le lien ci-dessous (vous devez cocher toutes les cases lors de l'installation) 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

le paquet openxlsx est vraiment bon pour lire et écrire des données énormes à partir de/dans des fichiers Excel et offre de nombreuses options pour le formatage personnalisé dans Excel.

Le fait intéressant est que nous n’avons pas à nous préoccuper de Java ici.

7
ayush varshney

Comme mentionné dans la question canonique Excel-> R , une alternative récente qui a émergé provient du paquetage readxl, qui j'ai trouvé assez rapide, comparé à, par exemple openxlsx et xlsx.

Cela dit, il existe une limite définitive de la taille de la feuille de calcul au-delà de laquelle il est probablement préférable de simplement sauvegarder la chose en tant que .csv et en utilisant fread.

5
MichaelChirico

J'ai aussi eu la même erreur dans les deux xlsx::read.xlsx et XLConnect::readWorksheetFromFile. Peut-être que vous pouvez utiliser RODBC::odbcDriverConnect et RODBC::sqlFetch, qui utilise Microsoft RODBC, ce qui est beaucoup plus efficace.

3
Jingnan Li

Je sais que cette question est un peu ancienne, mais il existe une bonne solution pour cela de nos jours. Ceci est un package par défaut lorsque vous essayez d'importer Excel dans Rstudio avec une interface graphique et que cela fonctionne bien dans ma situation.

library(readxl)

data <- read_Excel(filename)
2
Doongsil

La suggestion de @ flodel de convertir au format CSV semble la plus simple. Si pour une raison quelconque, ce n'est pas une option, vous pouvez lire le fichier par morceaux:

 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. 
 } 
2
Ricardo Saporta

J'ai trouvé ce fil à la recherche d'une réponse à la même question. Plutôt que d'essayer de pirater un fichier xlsx à partir de R, mon travail a été de convertir le fichier en .csv à l'aide de python), puis à importer le fichier dans R à l'aide d'une fonction d'analyse standard.

Départ: https://github.com/dilshod/xlsx2csv

0
Aaron