使用R和XLConnect包时出现“内存不足错误(Java)”

问题描述:

我尝试使用XLConnect包将大约30MB的Excel电子表格加载到R中。使用R和XLConnect包时出现“内存不足错误(Java)”

这是我写的:

wb <- loadWorkbook("largespreadsheet.xlsx") 

约15秒后,我得到了以下错误:

Error: OutOfMemoryError (Java): GC overhead limit exceeded.

这是对XLConnect包的限制或者是有办法调整我的记忆设置,以允许更大的文件?

我欣赏任何解决方案/提示/建议。

+1

您是否试过其他软件包?他们发生了什么事?其他人,我的意思是'xlsx'和'RExcel'。看看[这个小插图](http://cran.r-project.org/web/packages/xlsx/vignettes/xlsx.pdf)获取其他资源。 – Iterator

+1

另外,也许你可以验证问题最有可能是由于电子表格?例如,创建一个小电子表格并测试它的工作原理。如果可行,那么我会从电子表格中增加矩形,复制并粘贴,并查看是否可以找到突破点。电子表格中可能有些奇怪的东西。 – Iterator

+0

好处是,XLConnect软件包似乎适用于较小的电子表格。不过,我有兴趣在不改变电子表格的情况下找到解决方案。 – AME

遵守其website建议:

options(java.parameters = "-Xmx1024m") 
library(XLConnect) 
+9

即使设置了这些选项,我也会遇到此错误 - 错误:OutOfMemoryError(Java):Java堆空间。 – AME

+5

由于Ubuntu更新了Java或rJava包已更新,因此我现在多次出现内存不足问题。在为更多内存配置时,您的选项()解决方案已为我工作,因为在shell中具有unlim -c unlimited命令。但我一直在追逐这个问题。我已经迁移到了openxlsx,这会降低对Java的依赖,而依赖于C++。我从未回头。 –

+0

@BradHorn我遇到了这个问题,并尝试了不同的解决方案。我确定这是一个java问题,因为我的文件非常小,没有任何基于java的软件包解决了这个问题,直到我看到您的评论并尝试了openxlsx。 openxlsx是最简单的解决方案,用于查看它是否与数据相关的问题或与java相关的问题。我认为你应该将你的评论作为答案,因为人们可能不会注意到评论。 –

如果您仍然有问题的进口XLSX档案你可以使用这个opiton。带“Xmx1024m”的Anwser没有工作,我改为“-Xmx4g”。

options(java.parameters = "-Xmx4g") 
library(XLConnect) 

This链接很有用。

+1

这是我发现的适用于我的第一个解决方案。显然它需要至少有4个免费的RAM:http://www.bramschoenmakers.nl/en/node/726 – zkurtz

+1

最后没有为我工作 - 我收到一个错误,指出垃圾收集器的开销也是大。我得到Excel导出为CSV,然后使用本机read.csv与sep =“;” –

+0

即使运行这些命令后,我仍然有相同的错误。我在x86_64-apple-darwin13.1.0上运行r 3.1.1。 – kilojoules

openxlsx package中使用read.xlsx()。它不依赖于rJava,因此只具有R本身的内存限制。我还没有深入探讨编写和格式化XLSX,但它有一些看起来很有前途的插图。为阅读大型电子表格,它运作良好。

帽子提示@布拉德霍恩。我刚刚将他的评论作为答案,因为我也发现这是最好的解决方案!

+0

只需注意:该软件包在Windows上无法正常工作。它取决于Perl而不是Java,所以人们不得不安装它。 – Deleet

+0

的确,openxlsx软件包很好。但是,它不支持打开受密码保护的工作簿。 – dahved

+0

有没有包装可以做到这一点?它将如何获得密码?密码是否存储在脚本,环境变量中?有没有提示? – vpipkt

这似乎是这种情况,当你不重新使用R-Studio而反复使用相同的R-session。重新启动R-Studio可以帮助为程序分配新的内存堆。它立即为我工作。

万一有人看的不是一个巨大的,但许多文件时遇到这个错误,我设法通过释放Java虚拟机内存xlcFreeMemory(),从而解决了这个错误:

files <- list.files(path, pattern = "*.xlsx") 
for (i in seq_along(files)) { 
    wb <- loadWorkbook(...) 
    ... 
    rm(wb) 
    xlcFreeMemory() # <= free Java Virtual Machine memory ! 
} 
+0

这对我有用!我曾尝试设置java.parameters,但它不起作用。 – syd

+0

很棒的发现。我的问题是写和重写相同的文件。 (400K)xlsx文件全部完成。 – Dan

+0

另外,您可以使用以下命令查看可用内存:xlcMemoryReport() – aliawadh980

每当你使用的是依赖rJava的库(比如我们的RWeka),你肯定会在某一天达到默认的堆空间(512 MB)。现在,当您使用Java时,我们都知道要使用的JVM参数(如果您需要2 GB的RAM,则使用-Xmx2048m)。这只是一个如何在R环境中指定它的问题。

options(java.parameters = "-Xmx2048m") 
    library(rJava)