2

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

loadWorkbook使用or可以很好地将数据加载到 R 中,但是在使用任何导出函数( 、等) readWorksheetFromFile导出期间,更大的数据(数据帧大约 3MB)在写入 JVM 时会卡住,并且 R 停止响应。writeNamedRegionwriteWorksheetToFile

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

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

想法?

4

1 回答 1

2

鉴于您的参考值为 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 RAM 上运行)。

对于那些对 Apache POI 方面的内存使用进行更深入讨论感兴趣的人,可以进行以下讨论:http ://apache-poi.1045710.n5.nabble.com/HSSF-and-XSSF-memory-usage-一些数字-td4312784.html

于 2012-08-02T15:01:41.813 回答