导入一个大的xlsx文件到R?

我想知道是否有人知道从“大”xlsx文件(〜20Mb)导入数据的方法。 我试图使用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 

我也尝试在加载rJava之前修改java.parameters:

 > 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 

但没有任何工作。 有没有人有一个想法?

当有人派我(另一个)Excel文件分析时,我偶然发现了这个问题。 这一个是不是那么大,但不pipe出于什么原因,我遇到了类似的错误:

 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!

顺便说一句,我不想​​从德克E偷这个答案,所以如果他发布的答案,请接受而不是我的!

 options(java.parameters = "-Xmx2048m") ## memory set to 2 GB library(XLConnect) 

在加载任何Java组件之前,使用“选项”允许更多内存。 然后加载XLConnect库(它使用java)。

而已。 使用readWorksheet ….开始读取数据,依此类推。 🙂

我在xlsx::read.xlsxXLConnect::readWorksheetFromFile也有同样的错误。 也许你可以使用RODBC::odbcDriverConnectRODBC::sqlFetch ,它使用Microsoft RODBC,效率更高。

正如在规范的Excel-> R问题中提到的 ,最近出现的一个替代方法来自于readxl包, 我发现它相当快,比如openxlsxxlsx

也就是说,电子表格的大小有一定的限制,过去你可能最好把它保存为.csvfread

我同意@orvillejackson反应,这真的帮助我了。

内联到@orville jackson提供的答案。 这里是如何使用openxlsx读取和写入大文件的详细描述。

当数据量很小的时候,R有很多包和function可以按照你的要求使用。

write.xlsx,write.xlsx2,XLconnect也做这个工作,但是和openxlsx比起来,这些工作有时候会慢一些。

所以,如果你正在处理大数据集并遇到Java错误。 我会build议看看“openxlsx”这真是太棒了,减less了1/12的时间。

我testing了所有,最后我对openxlsxfunction的性能印象深刻。

以下是将多个数据集写入多个工作表的步骤。

 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未安装在您的系统上,请先安装以获得stream畅的体验。 这里是你的参考链接:(select适当的版本) https://cran.r-project.org/bin/windows/Rtools/

按照下面的链接检查选项(安装时需要选中所有checkbox) 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堆内存。

@ flodel的build议转换为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. } 

我发现这个线程寻找一个完全相同的问题的答案。 而不是尝试从R内部破解一个xlsx文件,结果是我的工作是使用python将文件转换为.csv,然后使用标准扫描function将文件导入到R中。

退房: https : //github.com/dilshod/xlsx2csv