我想知道是否有人知道从"大"xlsx文件(~20Mb)导入数据的方法.我尝试使用xlsx和XLConnect库.不幸的是,两者都使用rJava,我总是得到同样的错误:
> library(XLConnect)
> wb <- loadWorkbook("MyBigFile.xlsx")
Error: OutOfMemoryError (Java): Java heap space
Run Code Online (Sandbox Code Playgroud)
要么
> library(xlsx)
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, :
java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
我还尝试在加载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
Run Code Online (Sandbox Code Playgroud)
或者在加载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
Run Code Online (Sandbox Code Playgroud)
但没有任何作用.有没有人有想法?
orv*_*son 131
当有人发给我(另一个)Excel文件进行分析时,我偶然发现了这个问题.这个甚至不是那么大,但无论出于何种原因,我遇到了类似的错误:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
基于@Dirk Eddelbuettel在之前的回答中的评论,我安装了openxlsx软件包(http://cran.r-project.org/web/packages/openxlsx/).然后跑:
library("openxlsx")
mydf <- read.xlsx("BigExcelFile.xlsx", sheet = 1, startRow = 2, colNames = TRUE)
Run Code Online (Sandbox Code Playgroud)
这正是我所寻找的.易于使用和快速的邪恶.这是我的新BFF.感谢提示@Dirk E!
顺便说一句,我不想从Dirk E那里拿到这个答案,所以如果他发布了答案,请接受而不是我的!
小智 13
options(java.parameters = "-Xmx2048m") ## memory set to 2 GB
library(XLConnect)
Run Code Online (Sandbox Code Playgroud)
在加载任何java组件之前,使用"options"允许更多内存.然后加载XLConnect库(它使用java).
而已.使用readWorksheet ....开始读取数据,依此类推.:)
我知道这个问题有点老了,但是现在有一个很好的解决方案。当您尝试使用 GUI 在 Rstudio 中导入 excel 时,这是一个默认包,它在我的情况下运行良好。
library(readxl)
data <- read_excel(filename)
Run Code Online (Sandbox Code Playgroud)
我同意@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
Run Code Online (Sandbox Code Playgroud)
Sys.setenv("R_ZIPCMD"="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
Run Code Online (Sandbox Code Playgroud)
openxlsx包非常适合从excel文件中读取和写入大量数据,并且在excel中有很多自定义格式化选项.
有趣的是,我们不必在这里打扰java堆内存.
正如规范的Excel-> R问题所提到的,最近出现的替代方案来自于readxl包,我发现它比较快,与之相比,例如openxlsx和xlsx.
也就是说,电子表格大小有一个明确的限制,你可能最好只保存这个东西作为.csv和使用fread.
@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.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85430 次 |
| 最近记录: |