我在 R 中使用 XLConnect (Mirai Solutions) 时遇到了 JVM 内存问题。
使用 loadWorkbook
或 readWorksheetFromFile
将数据加载到 R 中效果很好,但较大的数据(大约 3MB 的数据帧)在导出期间使用任何一种方法写入 JVM 时会卡住导出函数(writeNamedRegion
、writeWorksheetToFile
等),并且 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/