r - xlConnect R 使用 JVM 内存

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

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

使用 loadWorkbookreadWorksheetFromFile 将数据加载到 R 中效果很好,但较大的数据(大约 3MB 的数据帧)在导出期间使用任何一种方法写入 JVM 时会卡住导出函数(writeNamedRegionwriteWorksheetToFile 等),并且 R 停止响应。

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

我使用的是 64 位 Windows 7 系统,配备 32 位 Office 软件和 32 位 Java,计算机具有 8GB RAM。与导出开始时 JVM 中大约 750 MB 的可用内存(使用 xlcMemoryReport 检查)相比,3MB 似乎并不是很大。

想法?

最佳答案

鉴于您的引用值为 3MB,我得出的结论是您正在尝试编写一个具有 10 列 x 40k 行(或类似的)尺寸的数值变量的 data.frame;此类 data.frame 的 object.size 导致大约。 3.2MB)。

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

您应该能够将前面提到的尺寸的 data.frame 写入最大尺寸为 xlsx 的 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(在具有 4GB RAM 的 32 位 Windows XP 上运行)。

对于那些有兴趣更深入讨论 Apache POI 端内存使用情况的人,可以进行以下讨论:http://apache-poi.1045710.n5.nabble.com/HSSF-and-XSSF-memory-usage-some-numbers-td4312784.html

关于r - xlConnect R 使用 JVM 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11766981/

相关文章:

windows - 有没有人为 Windows x64 编译 PCRE - 如果是这样,怎么做?

Tomcat 在启动时抛出 OutOfMemoryError

java - 如何开始使用 Java 模块?

java - yarn : Containers and JVM

日期和向量的 R 序列

Java 64 位比 32 位版本使用更多内存

64-bit - 32 位和 64 位处理器有什么区别?

r - 提高矩阵或数组的计算性能

r - 按组写入多个csv文件

r - 向facet_wrap中的每个方面添加标题