我面临一个奇怪的问题:我ffdf
使用保存数据
save.ffdf()
从ffbase
包中,当我在新的 R 会话中加载它们时,做
load.ffdf("data.f")
与 R中的对象相同的数据相比,它被加载到 RAM 中大约 90% 的内存data.frame
。遇到这个问题,使用它没有多大意义ffdf
,不是吗?我不能使用ffsave
,因为我在服务器上工作并且上面没有 zip 应用程序。
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 的“进程资源管理器”应用程序中检查)
> 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
[结束第二次编辑]