79

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

但没有任何效果。有人有想法吗?

4

8 回答 8

152

当有人向我发送(又一个)Excel 文件进行分析时,我偶然发现了这个问题。这个甚至没有那么大,但无论出于何种原因,我都遇到了类似的错误:

java.lang.OutOfMemoryError: GC overhead limit exceeded

根据@DirkEddelbuettel 在上一个答案中的评论,我安装了 openxlsx 包(http://cran.r-project.org/web/packages/openxlsx/)。然后跑:

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

这正是我想要的。易于使用且速度快。这是我的新BFF。感谢@DirkEddelbuettel 的提示!

顺便说一句,我不想​​从 Dirk E 那里偷走这个答案,所以如果他发布了答案,请接受它而不是我的!

于 2014-08-14T21:28:09.167 回答
16
options(java.parameters = "-Xmx2048m")  ## memory set to 2 GB
library(XLConnect)

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

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

于 2016-01-13T17:26:31.473 回答
9

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

library(readxl)

data <- read_excel(filename)
于 2018-05-15T02:18:01.980 回答
9

我同意@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 中的一些实用程序。

注意:如果您的系统上没有安装 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 堆内存烦恼。

于 2017-03-30T12:56:28.723 回答
5

正如规范的 Excel->R 问题中所提到的,最近出现的一个替代方案来自readxl包,我发现它相当快,与例如openxlsxxlsx.

也就是说,电子表格的大小有一个明确的限制,您最好将其保存为 a.csv并使用fread.

于 2015-07-30T22:52:24.097 回答
3

xlsx::read.xlsx我在和中也有同样的错误XLConnect::readWorksheetFromFile。也许您可以使用RODBC::odbcDriverConnectand RODBC::sqlFetch,它使用 Microsoft RODBC,效率更高。

于 2015-06-24T14:25:57.000 回答
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. 
 } 
于 2013-10-03T00:34:54.010 回答
0

我发现这个线程正在寻找完全相同问题的答案。与其尝试从 R 中破解 xlsx 文件,最终对我有用的是使用 python 将文件转换为 .csv,然后使用标准扫描功能将文件导入 R。

查看:https ://github.com/dilshod/xlsx2csv

于 2014-06-19T00:44:17.823 回答