加载ffdf数据会占用大量内存

时间:2012-12-19 13:53:46

标签: r

我面临一个奇怪的问题: 我使用

保存ffdf数据
save.ffdf()

来自ffbase包,当我在新的R会话中加载它们时,执行

load.ffdf("data.f") 

它被加载到RAM aprox 90%的内存中,而不是与R中的data.frame对象相同的数据。 遇到这个问题,使用ffdf没有多大意义,不是吗? 我无法使用ffsave因为我在服务器上工作而且没有拉链应用程序。

packageVersion(ff) # 2.2.10
packageVersion(ffbase) # 0.6.3

任何想法?

[编辑]一些代码示例,以帮助澄清:

data <- read.csv.ffdf(file = fn, header = T, colClasses = classes) 
# file fn is a csv database with 5 columns and 2.6 million rows,
# with some factor cols  and some integer cols. 
data.1 <- data 
save.ffdf(data.1 , dir = my.dir) # my.dir is a string pointing to the file. "C:/data/R/test.f" for example. 

关闭R会话......再次开幕:

load.ffdf(file.name) # file.name is a string pointing to the file. 
#that gives me object data, with class(data) = ffdf. 

然后我有一个数据对象ffdf [5],其内存大小几乎与:

data.R <- data[,] # which is a data.frame. 

[编辑结束]

* [第二编辑::完全可重复编码:::]

由于我的问题尚未得到解答,我仍然发现问题,我给出了一个可重现的例子::

dir1 <- 'P:/Projects/RLargeData';
setwd(dir1);
library(ff)
library(ffbase)

memory.limit(size=4000)
N = 1e7; 
df <- data.frame( 
 x = c(1:N), 
 y = sample(letters, N, replace =T), 
 z = sample( as.Date(sample(c(1:2000), N, replace=T), origin="1970-01-01")),
 w = factor( sample(c(1:N/10) , N, replace=T))   )

df[1:10,]
dff <- as.ffdf(df)
head(dff)
#str(dff)

save.ffdf(dff, dir = "dframeffdf")
dim(dff)
# on disk, the directory "dframeffdf" is : 205 MB (215.706.264 bytes)

### resetting R :: fresh RStudio Session 
dir1 <- 'P:/Projects/RLargeData';
setwd(dir1);
library(ff)
library(ffbase)
memory.size() # 15.63 
load.ffdf(dir = "dframeffdf")
memory.size() # 384.42
gc()
memory.size() # 287

所以我们进入内存384 Mb,并且在gc()之后有287,这大约是磁盘中数据的大小。 (也在Windows的“Process explorer”应用程序中查看)

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=Danish_Denmark.1252  LC_CTYPE=Danish_Denmark.1252    LC_MONETARY=Danish_Denmark.1252 LC_NUMERIC=C                    LC_TIME=Danish_Denmark.1252    

attached base packages:
[1] tools     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ffbase_0.7-1 ff_2.2-10    bit_1.1-9

[END SECOND EDIT]

2 个答案:

答案 0 :(得分:2)

在ff中,当您有因子列时,因子级别始终在RAM中。 ff字符列当前不存在,字符列转换为ffdf中的因子。

关于您的示例:'dff'中的'w'列包含超过6 Mio级别。这些级别都在RAM中。如果你没有很多级别的列,你就不会看到RAM的增加,如下图所示。

N = 1e7; 
df <- data.frame( 
 x = c(1:N), 
 y = sample(letters, N, replace =T), 
 z = sample( as.Date(sample(c(1:2000), N, replace=T), origin="1970-01-01")),
 w = sample(c(1:N/10) , N, replace=T))   
dff <- as.ffdf(df)
save.ffdf(dff, dir = "dframeffdf")

### resetting R :: fresh RStudio Session 
library(ff)
library(ffbase)
memory.size() # 14.67
load.ffdf(dir = "dframeffdf")
memory.size() # 14.78

答案 1 :(得分:0)

ffdf软件包具有在“物理”和“虚拟”存储中隔离对象的机制。我怀疑你是隐式在物理内存中构建项目,但由于你没有编写这个工作区的创建方式,所以只有这么多的猜测是可能的。