将大型xlsx文件导入R?

时间:2013-10-02 22:31:10

标签: r excel xlsx

我想知道是否有人知道从“大”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

但没有任何作用。有没有人有想法?

8 个答案:

答案 0 :(得分:118)

当有人发给我(另一个)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那里得到这个答案,所以如果他发布了答案,请接受而不是我的答案!

答案 1 :(得分:13)

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

使用&#34;选项&#34;允许更多内存在加载任何java组件之前。然后加载XLConnect库(它使用java)。

那就是它。使用readWorksheet ....开始读取数据,依此类推。 :)

答案 2 :(得分:6)

我同意@orville jackson的回应&amp;它真的对我有帮助。

请联系@orville jackson提供的答案。以下是如何使用 openxlsx 来读写大文件的详细说明。

当数据量很小时,R有许多包和功能,可根据您的要求使用。

write.xlsx,write.xlsx2,XLconnect 也可以开展工作,但与openxlsx相比,这些工作有时会很慢。

因此,如果您正在处理大型数据集并遇到java错误。我建议看看&#34; openxlsx&#34;这真是太棒了,减少了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(&#34; R_ZIPCMD&#34; =&#34; 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堆内存。

答案 3 :(得分:5)

正如the canonical Excel->R question中所提到的,最近出现的替代方案来自readxl包,其中I've found非常快,与例如openxlsxxlsx

也就是说,电子表格大小有一个明确的限制,你可能最好只保存.csv并使用fread

答案 4 :(得分:3)

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

答案 5 :(得分:2)

@ 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. 
 } 

答案 6 :(得分:1)

我知道这个问题有点陈旧,但现在有一个很好的解决方案。当您尝试使用GUI在Rstudio中导入excel时这是一个默认包,它在我的情况下运行良好。

library(readxl)

data <- read_excel(filename)

答案 7 :(得分:0)

我发现这个帖子正在寻找完全相同问题的答案。而不是试图从R内部破解xlsx文件,最终为我工作的是使用python将文件转换为.csv,然后使用标准扫描功能将文件导入R.

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