1

私は奇妙な問題に直面しています:私はffdf使用してデータを保存します

save.ffdf()

パッケージからffbase、そしてそれらを新しいRセッションにロードするときに、

load.ffdf("data.f") 

data.frameRのオブジェクトと同じデータよりもメモリの約90%がRAMにロードされます。この問題があると、使用する意味があまりありません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. 

【編集終わり】

* [ 2 番目の編集:: 完全に再現可能なコード ::: ]

私の質問にはまだ答えがなく、まだ問題が見つかっているので、再現可能な例を挙げます::

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

[2 番目の編集を終了]

4

2 に答える 2

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
于 2013-02-22T11:24:09.533 に答える
0

ffdfパッケージには、「物理」ストレージと「仮想」ストレージでオブジェクトを分離するためのメカニズムがあります。物理メモリに暗黙的にアイテムを作成しているのではないかと思いますが、このワークスペースの作成方法をコーディングしていないため、推測できるのはそれほど多くありません。

于 2012-12-19T18:34:11.550 に答える