ffdf对象消耗额外的RAM(以GB为单位)

时间:2016-02-03 10:38:17

标签: r memory ff bigdata

我决定测试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 - &gt;上限(~8Gb) - > 5.25Gb。 对象大小(通过object.size())大约为12 kb。

我关心的是RAM额外分配(~2.3 GB)。根据包装说明它应该只增加12 kb。我不使用任何角色。

也许我错过了一些ff包。

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一种解决方案,可以省去额外的RAM。

首先,有必要注意诸如“第一个”之类的论点。和&#39; next.rows&#39;方法&#39; read.table.ffdf&#39;在ff包中。

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

额外的内存分配是第二个参数的主题(&#39; next.rows&#39;)。如果你想拥有没有额外RAM分配的ffdf对象(在我的情况下 - 在Gb中),那么你需要为下一个块选择这样的行数,使得块的大小不应超过&#39; getOption的值(&#34; ffbatchbytes&#34)&#39;

在我的情况下,我使用了&#39; first.rows = 1000&#39;和&#39; next.rows = 1000&#39;并且任务管理器中的RAM分配总量高达1Mb。 &#39; next.rows&#39;高达10000导致RAM增长8-9 Mb。

因此,这些论据取决于您的实验,以获得最佳比例。

此外,你必须记住,下一步的增加。将影响制作ffdf对象的处理时间(通过几次运行):

&#39; first.rows = 1000&#39;和&#39; next.rows = 1000&#39;大概是1500秒。 (RAM~1Mb) &#39; first.rows = 1000&#39;和&#39; next.rows = 10000&#39;大概是230秒。 (RAM~9Mb)

相关问题