在R中,我遇到了使用XLConnect (Mirai解决方案)的JVM内存问题。
使用loadWorkbook或readWorksheetFromFile可以很好地将数据加载到R中,但是更大的数据(数据帧约为3MB)在使用任何导出函数(writeNamedRegion、writeWorksheetToFile等)导出过程中写入JVM时会被卡住,而R将停止响应。
我已经使用options(java.parameters = "-Xmx1500m")重置了java参数,这增加了我能够导出到Excel的数据帧的大小,但是R仍然慢在1MB左右,不能工作在3MB左右。
我在64位Windows 7系统上使用32位Office软件,32位Java在一台有8GB内存的机器上运行。与JVM中大约750 MB的空闲内存相比,3MB似乎不太大,该内存应该在导出开始时就存在(使用xlcMemoryReport检查)。
想法?
发布于 2012-08-02 15:01:41
考虑到3MB的引用值,我的结论是,您正在尝试编写一个data.frame,其数值变量为维度10列x40k行(或可比较的);这样一个data.frame的object.size结果大约为x。3.2MB)。
根据您试图编写xls (BIFF8)或xlsx (OOXML)文件的情况,内存需求可能会有很大的不同。原因是xlsx文档实际上是压缩的XML文件,Apache (它是XLConnect使用的底层Java )使用xmlbean来操作这些文件--这可能是相当大的内存强度。另一方面,BIFF8是一种二进制数据格式,需要更少的内存。
您应该能够将前面提到的维度的data.frame写入具有最大值的xlsx文档。堆大小为1024米,即对我来说很好:
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")..。使用R2.15.1 32位与RStudio,XLConnect 0.2-0和JRE 1.6.0_25 (运行在32位Windows与4GB内存)。
对于那些对Apache方面对内存使用的更深入讨论感兴趣的人,有以下讨论:http://apache-poi.1045710.n5.nabble.com/HSSF-and-XSSF-memory-usage-some-numbers-td4312784.html
https://stackoverflow.com/questions/11766981
复制相似问题