使用 R 和 XLConnect 包时出现“内存不足错误 (Java)”
Posted
技术标签:
【中文标题】使用 R 和 XLConnect 包时出现“内存不足错误 (Java)”【英文标题】:"Out of Memory Error (Java)" when using R and XLConnect package 【发布时间】:2011-12-19 06:55:12 【问题描述】:我尝试使用 XLConnect 包将约 30MB 的 Excel 电子表格加载到 R 中。
这是我写的:
wb <- loadWorkbook("largespreadsheet.xlsx")
大约 15 秒后,我收到以下错误:
错误:OutOfMemoryError (Java):超出 GC 开销限制。
这是 XLConnect 软件包的限制,还是有办法调整我的内存设置以允许更大的文件?
感谢任何解决方案/提示/建议。
【问题讨论】:
你试过其他的包吗?他们怎么了?其他人的意思是xlsx
和RExcel
。查看this vignette 以获取其他资源。
另外,也许您可以验证问题很可能是由电子表格引起的?例如,创建一个小型电子表格并测试它是否有效。如果可行,我会从电子表格中获取越来越多的矩形,复制和粘贴,看看是否可以找到断点。也许电子表格中有一些奇怪的东西。
好点,XLConnect 包似乎确实适用于较小的电子表格。但是,我有兴趣在不每次都更改电子表格的情况下找到解决此问题的方法。
假设地说,电子表格可能存在导致 XLConnect 解析问题的问题。在这种情况下,更改 XLConnect 的内存分配将无济于事。如果您可以更改为其他文件类型,例如XLS 或 CSV,这可能会有所帮助。
另外,你试过增加矩形的方法吗?您可以通过 COM 连接或 Excel 中的脚本自动保存工作表。我会确保没有一些时髦的东西,比如括号/大括号、特殊的文本(例如奇怪的引号、<
或 >
),或者其他导致问题的东西。当然包应该能够加载数据,但是解析奇怪的格式总是一个问题。
【参考方案1】:
听从他们website的建议:
options(java.parameters = "-Xmx1024m")
library(XLConnect)
【讨论】:
即使在设置了这些选项之后,我还是遇到了这个错误 - 错误:OutOfMemoryError (Java): Java Heap Space. 在 Ubuntu 更新 Java 或更新包 rJava 时,我已经多次遇到内存不足的问题。当配置为更多内存时,您的 options() 解决方案对我有用,shell 中的 unlim -c unlimited 命令也是如此。但我已经完成了这个问题。我已经迁移到 openxlsx,它放弃了对 Java 的任何依赖,转而依赖于 C++。我从未回头。 @BradHorn 我遇到了这个问题并尝试了不同的解决方案。我确信这是一个 java 问题,因为我的文件非常小,并且没有一个基于 java 的包解决了这个问题,直到我看到你的评论并尝试了 openxlsx。 openxlsx 是尝试查看是数据相关问题还是 java 相关问题的最简单解决方案。我认为您应该将您的评论作为答案,因为人们可能不会注意到评论。【参考方案2】:如果您在导入 XLSX 文件时仍有问题,您可以使用此选项。带有“Xmx1024m”的 Anwser 不起作用,我改为“-Xmx4g”。
options(java.parameters = "-Xmx4g" )
library(XLConnect)
This 链接很有用。
【讨论】:
这是我发现的第一个适合我的解决方案。显然,它需要至少 4 个免费的 RAM:bramschoenmakers.nl/en/node/726 最后对我不起作用 - 我收到一个错误,指出垃圾收集器开销太大。我将 Excel 导出为 CSV,然后使用带有 sep=";" 的本机 read.csv 即使在运行这些命令后,我仍然遇到同样的错误。我在 x86_64-apple-darwin13.1.0 上运行 r 3.1.1。 如果设置后仍然遇到错误,请考虑使用其他格式。【参考方案3】:在openxlsx
package 中使用read.xlsx()
。它不依赖于rJava
,因此只有 R 本身的内存限制。我还没有深入探索 XLSX 的编写和格式化,但它有一些看起来很有前途的小插曲。对于阅读大型电子表格,效果很好。
向@Brad-Horn 致敬。我刚刚将他的评论作为答案,因为我也发现这是最好的解决方案!
【讨论】:
请注意:此软件包在 Windows 上无法正常运行。它依赖于 Perl 而不是 Java,因此必须费心安装它。 确实 openxlsx 包很好。但是,它不支持打开受密码保护的工作簿。 有这样的包吗?它将如何获得密码?密码是否存储在脚本、环境变量中?有提示吗?【参考方案4】:如果有人在读取不是一个大文件而是 许多 个文件时遇到此错误,我设法通过使用 xlcFreeMemory()
释放 Java 虚拟机内存来解决此错误,因此:
files <- list.files(path, pattern = "*.xlsx")
for (i in seq_along(files))
wb <- loadWorkbook(...)
...
rm(wb)
xlcFreeMemory() # <= free Java Virtual Machine memory !
【讨论】:
这对我有用!我尝试设置java.parameters
,但没有成功。
很棒的发现。我的问题是编写和重写同一个文件。 (400K)xlsx 文件全部完成后。
另外,您可以使用它来查看可用内存:xlcMemoryReport()【参考方案5】:
这似乎是这种情况,当您一遍又一遍地使用相同的 R-session 而不重新启动 R-Studio 时。重新启动 R-Studio 有助于为程序分配新的内存堆。它立即对我有用。
【讨论】:
【参考方案6】:每当您使用依赖于 rJava 的库(例如我的 RWeka)时,您总有一天会达到默认堆空间 (512 MB)。现在,当您使用 Java 时,我们都知道要使用的 JVM 参数(如果您想要 2 GB 的 RAM,则为 -Xmx2048m)。这里只是如何在R环境中指定它的问题。
options(java.parameters = "-Xmx2048m")
library(rJava)
【讨论】:
当我尝试这个 > options(java.parameters = "-Xmx20g") > library(rJava) > xlcMemoryReport() Java 虚拟机 (JVM) 中的可用内存量:451.2915 MB跨度> 【参考方案7】:正如here 中所建议的那样,请确保在代码的第一行中运行选项函数。就我而言,它仅在我重新启动 R 会话并在第一行运行时才有效。
options(java.parameters = "-Xmx4g" )
library(XLConnect)
【讨论】:
以上是关于使用 R 和 XLConnect 包时出现“内存不足错误 (Java)”的主要内容,如果未能解决你的问题,请参考以下文章
从 R 中的 e1071 包训练 SVM 时出现错误“(下标)逻辑下标太长”