我想知道是否有人知道从“大”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
但没有任何作用。有没有人有想法?
答案 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非常快,与例如openxlsx
和xlsx
。
也就是说,电子表格大小有一个明确的限制,你可能最好只保存.csv
并使用fread
。
答案 4 :(得分:3)
我在xlsx::read.xlsx
和XLConnect::readWorksheetFromFile
中也遇到了同样的错误。也许你可以使用RODBC::odbcDriverConnect
和RODBC::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.