0

我决定测试 ff 包的关键优势 - RAM 最小分配(PC 规格:i5、RAM 8Gb、Win7 64 位、Rstudio)。

根据包描述,我们可以像虚拟对象一样操作物理对象(文件),就好像它们被分配到 RAM 中一样。因此,实际 RAM 使用量大大减少(从 Gb 到 kb)。我使用的代码如下:

library(ff)
library(ffbase)

setwd("D:/My_package/Personal/R/reading")
x<-cbind(rnorm(1:100000000),rnorm(1:100000000),1:100000000)
system.time(write.csv2(x,"test.csv",row.names=FALSE))

system.time(x <- read.csv2.ffdf(file="test.csv", header=TRUE,       first.rows=100000, next.rows=100000000,levels=NULL))         
print(object.size(x)/1024/1024)
print(class(x))

实际文件大小为 4.5 Gb,实际使用的 RAM 以这种方式变化(通过任务管理器):2,92 -> 上限(~8Gb)-> 5.25Gb。对象大小(通过 object.size())约为 12 kb。

我担心的是 RAM 额外分配(~2.3 GB)。根据包描述,它应该只增加了 12 kb。我不使用任何字符。

也许我错过了一些 ff 包。

4

1 回答 1

0

好吧,我找到了一个解决方案来消除额外 RAM 的使用。

首先需要注意ff包中方法'read.table.ffdf'的'first.rows'和'next.rows'等参数。

第一个参数('first.rows')规定了行数量的初始块,并规定了初始内存分配。我使用了默认值(1000 行)。

额外的内存分配是第二个参数('next.rows')的主题。如果您想在没有额外 RAM 分配的情况下拥有 ffdf 对象(在我的情况下 - 以 Gb 为单位),那么您需要为下一个块选择如此多的行,使得块的大小不应超过 'getOption("ffbatchbytes “)”。

在我的情况下,我使用了“first.rows=1000”和“next.rows=1000”,并且在任务管理器中总的 RAM 分配变化高达 1Mb。'next.rows' 增加到 10000 导致 RAM 增长了 8-9 Mb。

所以这个论点要根据你的实验来挑出最好的比例。

此外,您必须记住,'next.rows' 的增加将影响处理时间以制作 ffdf 对象(通过多次运行):

'first.rows=1000' 和 'next.rows=1000' 大约是 1500 秒。(RAM ~ 1Mb) 'first.rows=1000' 和 'next.rows=10000' 大约是 230 秒。(RAM ~ 9Mb)

于 2016-02-04T16:33:42.393 回答