Excel &引用;内存不足错误(Java)“;使用XLR和XLConnect软件包时

Excel &引用;内存不足错误(Java)“;使用XLR和XLConnect软件包时,excel,r,memory,Excel,R,Memory,我尝试使用XLConnect软件包将一个约30MB的excel电子表格加载到R中 这是我写的: wb <- loadWorkbook("largespreadsheet.xlsx") wb遵循他们的建议: 如果在导入XLSX文件时仍有问题,可以使用此选项。带有“Xmx1024m”的Anwser不起作用,我改为“-Xmx4g” 链接很有用。在中使用read.xlsx()。它不依赖于rJava,因此只有R本身的内存限制。我还没有深入探讨过XLSX的编写和格式化,但它有一些很有前途的小插曲。对

我尝试使用XLConnect软件包将一个约30MB的excel电子表格加载到R中

这是我写的:

wb <- loadWorkbook("largespreadsheet.xlsx")

wb遵循他们的建议:


如果在导入XLSX文件时仍有问题,可以使用此选项。带有“Xmx1024m”的Anwser不起作用,我改为“-Xmx4g”

链接很有用。

在中使用
read.xlsx()
。它不依赖于rJava,因此只有R本身的内存限制。我还没有深入探讨过XLSX的编写和格式化,但它有一些很有前途的小插曲。对于阅读大型电子表格,它工作得很好


给@Brad Horn的帽尖。我刚刚把他的评论作为答案,因为我也发现这是最好的解决方案

如果你不重新启动R-Studio而反复使用同一个R-session,情况似乎就是这样。重新启动R-Studio有助于为程序分配新的内存堆。它立即对我起了作用。

如果有人在读取不是一个大文件而是多个文件时遇到此错误,我设法通过使用
xlcFreeMemory()
释放Java虚拟机内存来解决此错误,因此:

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

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

   options(java.parameters = "-Xmx2048m")
   library(rJava)
正如本文所建议的,确保在代码的第一行中运行option函数。在我的例子中,只有当我重新启动R会话并在第一行运行它时,它才起作用

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


即使设置了这些选项,我还是遇到了这个错误——错误:OutOfMemoryError(Java):Java堆空间。您的options()解决方案在配置更多内存时对我有效,shell中的unlim-c unlimited命令也是如此。但我不再追问这个问题了。IVE迁移到OpenXLSX,这降低了对java的依赖性,而依赖C++。“我从来没有回头看过。”布拉德霍恩我遇到了这个问题,并尝试了不同的解决方案。我确信这是一个java问题,因为我的文件非常小,没有一个基于java的包解决了这个问题,直到我看到你的评论并尝试openxlsx。openxlsx是最简单的解决方案,可以尝试查看它是与数据相关的问题还是与java相关的问题。我认为你应该把你的评论作为答案,因为人们可能不会注意到评论。你试过其他软件包吗?他们怎么了?我指的是
xlsx
RExcel
。查看其他资源。另外,也许您可以验证问题最有可能是由于电子表格造成的?例如,创建一个小的电子表格并测试它是否有效。如果可以的话,我会从电子表格中增加矩形,复制粘贴,看看是否能找到断点。也许电子表格中有一些奇怪的东西。好的一点是,XLConnect软件包似乎确实适用于较小的电子表格。但是,我感兴趣的是在不每次更改电子表格的情况下找到这个问题的解决方案。假设说,电子表格有问题可能会导致XLConnect的解析问题。在这种情况下,更改XLConnect的内存分配将没有帮助。如果您可以更改为其他文件类型,例如XLS或CSV,这可能会有所帮助。此外,您是否尝试过增加矩形的方法?您可以通过COM连接或Excel中的脚本自动保存工作表。我会确保没有像括号/大括号这样的时髦的东西,特殊的文本(例如奇数引号,
),或者其他导致问题的东西。当然,软件包应该能够加载数据,但是解析奇怪的格式总是一个难题。这是我发现的第一个适合我的解决方案。显然,它需要至少有4个空闲的RAM:最终对我来说不起作用-我得到一个错误,指出垃圾收集器开销太大。我让Excel导出到CSV,然后使用带sep=“;”的本机read.CSV,即使在运行这些命令之后,我仍然有相同的错误。我正在x86_64-apple-darwin13.1.0上运行r 3.1.1。如果设置此选项后仍遇到错误,则应考虑使用其他格式。请注意:此软件包在Windows上无法正常工作。它依赖于Perl而不是Java,因此我们不得不费心去安装它。但是,它不支持打开受密码保护的工作簿。有这样的软件包吗?它如何获得密码?密码是否存储在脚本、环境变量中?有什么提示吗?这对我很有效!我试过设置
java.parameters
,但没有成功。很好的发现。我的问题是写和重写同一个文件。(400K)xlsx文件。此外,当我尝试此选项>选项(java.parameters=“-Xmx20g”)>库(rJava)>xlcMemoryReport()时,您可以使用此选项查看可用内存。java虚拟机(JVM)中的可用内存量:451.2915 MB这对我很有用-谢谢!
   options(java.parameters = "-Xmx2048m")
   library(rJava)
options(java.parameters = "-Xmx4g" )
library(XLConnect)