2012-01-17 15 views
4

ff package of Rを使用して、fsdfオブジェクトにcsvファイルをインポートしましたが、オブジェクトが約700MBのRAMを占有していたことに驚きました。 ffはRAMではなくディスクにデータを保存するのではないですか?私は間違ったことをしましたか?私はRの初心者です。どんなアドバイスも感謝しています。ありがとう。ffはまだRAMにデータを保存していますか?

> training.ffdf <- read.csv.ffdf(file="c:/temp/training.csv", header=T) 
> # [Edit: the csv file is conceptually a large data frame consisting 
> # of heterogeneous types of data --- some integers and some character 
> # strings.] 
> 
> # The ffdf object occupies 718MB!!! 
> object.size(training.ffdf) 
753193048 bytes 
Warning messages: 
1: In structure(.Internal(object.size(x)), class = "object_size") : 
    Reached total allocation of 1535Mb: see help(memory.size) 
2: In structure(.Internal(object.size(x)), class = "object_size") : 
    Reached total allocation of 1535Mb: see help(memory.size) 
> 
> # Shouldn't biglm be able to process data in small chunks?! 
> fit <- biglm(y ~ as.factor(x), data=training.ffdf) 
Error: cannot allocate vector of size 18.5 Mb 

編集:私はトミーのアドバイスに従って、object.sizeコールを省略し、タスクマネージャ(私は4ギガバイトのRAMを使用してWindows XPマシン上でRを実行した)を見ました。私はオブジェクトをffsaveし、Rを閉じ、それを再度開き、ファイルからデータをロードしました。問題が勝っ:

> library(ff); library(biglm) 
> # At this point RGui.exe had used up 26176 KB of memory 
> ffload(file="c:/temp/trainingffimg") 
> # Now 701160 KB 
> fit <- biglm(y ~ as.factor(x), data=training.ffdf) 
Error: cannot allocate vector of size 18.5 Mb 

は私も

> options("ffmaxbytes" = 402653184) # default = 804782080 B ~ 767.5 MB 

を試してみましたが、それでもエラーを発行したデータをロードした後、RGuiはまだメモリの700メガバイトとbiglm回帰よりも多くを使用します。

+0

biglmには独自のメモリ処理があり、モデルを更新するためにチャンクでデータチャンクを渡すことができますが、ffオブジェクトを使用することはできません。私はあなたが使用する関数のドキュメントを読むことをお勧めします。 – mdsumner

+0

biglmと併用する方法は?ffを参照してください – mdsumner

+0

ありがとう、@mdsummer。私はその文書を読んだ。明らかに、上記のbiglm行のエラーはbiglm()がデータフレームを期待しているが、ffdfはデータフレームではないためです。正しい使用法は、biglm(y〜as.factor(x)、data = training.ffdf [、c(2,5)])のようなものでなければなりません。列インデックスを使用すると、ffdfはデータフレームを返します。しかし、これらのすべてはもちろん、なぜtraining.fdffオブジェクト自体が700MB以上のメモリを占めるのか説明しません。 – user740006

答えて

2

ffパッケージは、メモリマッピングを使用して、必要に応じてデータの一部をメモリにロードするだけです。

しかし、object.sizeを呼び出すと、実際にはすべてをメモリにロードするようになります!それは警告メッセージが示すようなものです...

そうしないでください...タスクマネージャー(Windows)またはトップコマンド(Linux)を使用して、Rプロセスが実際に使用するメモリの量を確認してくださいあなたはデータをロードしました。

+0

私はそれが 'object.size'それ自体の呼び出しではないと思いますが、彼らが_entire_' training.ffdf'オブジェクトのサイズを求めているという事実です。私。 'object.size(training.ffdf [1,1])'が動作するかもしれません...ちょっと推測してください。 –

+0

@JoshuaUlrich - 「object.size」は、データセット内のすべてのオブジェクトを再帰的にチェックするように思われます。おそらく、それらをすべてメモリに完全に実装(ロード)するよう促します。 – Tommy

+0

ありがとう、トミー。 object.sizeの呼び出しを省略しましたが、問題は残ります。私の編集を参照してください。 – user740006

5

あなたはbiglmにチャンクでデータを提供する必要がありますか?biglmを参照してください。 あなたの代わりにdata.frameのFFDFオブジェクトを渡す場合は、次のような2つの問題のいずれかに実行します。

  1. FFDFはdata.frameないので、未定義の何かが、あなたに
  2. 機能を起こりますffdfをdata.frameに変換しようとしました。簡単にあなたのRAMを使い果たすas.data.frame(FFDF)が、これはおそらくbiglmにFFDFからチャンクを渡す方法の例について

あなたにチェック!chunk.ffdfを起こったものです。

+1

または、ffbaseパッケージのbigglm.ffdfを使用してください。これはあなたのためにチャンクします。 – jwijffels

1

私は同じ問題を抱えていて、質問を投稿しました。問題の説明があります。 ファイルを読み込むと、文字行が要因として扱われ、多数の一意のレベルがある場合はRAMに格納されます。 ffは常にファクタレベルをRAMにロードするようです。

Loading ffdf data take a lot of memory

最高、 ミゲル:私の質問でjwijffelsからこの の回答を参照してください。