xlConnect R 使用 JVM 内存
Posted
技术标签:
【中文标题】xlConnect R 使用 JVM 内存【英文标题】:xlConnect R use of JVM memory 【发布时间】:2012-07-30 19:20:11 【问题描述】:我在 R 中使用 XLConnect (Mirai Solutions) 时遇到了 JVM 内存问题。
使用loadWorkbook
或readWorksheetFromFile
将数据加载到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
检查)。
想法?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于xlConnect R 使用 JVM 内存的主要内容,如果未能解决你的问题,请参考以下文章
R XLSX 和 XLConnect 包 - 使用 xlsx 包格式化由 XLConnect 创建的工作簿对象?
r R:从Web下载文件,使用XLConnect读取整个XLS工作簿,访问电子表格