【问题标题】:"Out of Memory Error (Java)" when using R and XLConnect package使用 R 和 XLConnect 包时出现“内存不足错误 (Java)”
【发布时间】:2011-12-19 06:55:12
【问题描述】:

我尝试使用 XLConnect 包将约 30MB 的 Excel 电子表格加载到 R 中。

这是我写的:

wb <- loadWorkbook("largespreadsheet.xlsx")

大约 15 秒后,我收到以下错误:

错误:OutOfMemoryError (Java):超出 GC 开销限制。

这是 XLConnect 软件包的限制,还是有办法调整我的内存设置以允许更大的文件?

感谢任何解决方案/提示/建议。

【问题讨论】:

  • 你试过其他的包吗?他们怎么了?其他人的意思是xlsxRExcel。查看this vignette 以获取其他资源。
  • 另外,也许您可​​以验证问题很可能是由电子表格引起的?例如,创建一个小型电子表格并测试它是否有效。如果可行,我会从电子表格中获取越来越多的矩形,复制和粘贴,看看是否可以找到断点。也许电子表格中有一些奇怪的东西。
  • 好点,XLConnect 包似乎确实适用于较小的电子表格。但是,我有兴趣在不每次都更改电子表格的情况下找到解决此问题的方法。
  • 假设地说,电子表格可能存在导致 XLConnect 解析问题的问题。在这种情况下,更改 XLConnect 的内存分配将无济于事。如果您可以更改为其他文件类型,例如XLS 或 CSV,这可能会有所帮助。
  • 另外,你试过增加矩形的方法吗?您可以通过 COM 连接或 Excel 中的脚本自动保存工作表。我会确保没有一些时髦的东西,比如括号/大括号、特殊的文本(例如奇怪的引号、&lt;&gt;),或者其他导致问题的东西。当然包应该能够加载数据,但是解析奇怪的格式总是一个问题。

标签: excel r memory


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-24
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多