【问题标题】:xlConnect R use of JVM memoryxlConnect R 使用 JVM 内存
【发布时间】:2025-12-19 12:45:06
【问题描述】:

我在 R 中使用 XLConnect (Mirai Solutions) 时遇到了 JVM 内存问题。

使用loadWorkbookreadWorksheetFromFile 将数据加载到R 中很好,但是在使用任何导出函数(writeNamedRegion、@987654324 @ 等),并且 R 停止响应。

我已经使用options(java.parameters = "-Xmx1500m") 重置了 java 参数,这增加了我能够导出到 Excel 的数据帧的大小,但是 R 仍然会减慢大约 1MB 并且无法在 3MB 左右工作。

我在 64 位 Windows 7 系统上运行 32 位 Office 软件和 32 位 Java,并在一台具有 8GB RAM 的机器上运行。与 JVM 中大约 750 MB 的可用内存相比,3MB 似乎不是很大,据说在导出开始时就在那里(使用xlcMemoryReport 检查)。

想法?

【问题讨论】:

    标签: r jvm 32bit-64bit heap-memory xlconnect


    【解决方案1】:

    鉴于您的参考值为 3MB,我得出的结论是,您正在尝试编写一个带有 10 列 x 40k 行(或可比较的)数值变量的 data.frame;这样一个 data.frame 的 object.size 大约为3.2MB)。

    根据您是尝试编写 xls (BIFF8) 还是 xlsx (OOXML) 文件,内存要求可能会有很大不同。原因是 xlsx 文档实际上是压缩的 XML 文件,而 Apache POI(XLConnect 使用的底层 Java API)使用 xmlbeans 来操作这些文件 - 这可能会占用大量内存。另一方面,BIFF8 是一种二进制数据格式,需要较少的内存。

    您应该能够将前面提到的维度的 data.frame 写入最大的 xlsx 文档。堆大小为 1024m,即以下对我来说很好:

    options(java.parameters = "-Xmx1024m") # required BEFORE any JVM is initialized in R
    require(XLConnect)
    tmp = as.data.frame(matrix(rnorm(4e5), ncol = 10))
    writeWorksheetToFile(tmp, file = "test.xlsx", sheet = "test")
    

    ... 将 R 2.15.1 32 位与 RStudio、XLConnect 0.2-0 和 JRE 1.6.0_25 结合使用(在 32 位 Windows XP 和 4GB 内存上运行)。

    如果有兴趣更深入地讨论 Apache POI 方面的内存使用情况,请参阅以下讨论:http://apache-poi.1045710.n5.nabble.com/HSSF-and-XSSF-memory-usage-some-numbers-td4312784.html

    【讨论】: