2

ff/ffdf および ffdfdply 関数を使用すると、「エラー: サイズ ... MB のベクトルを割り当てることができません」という問題が発生します。

ff および ffdf パッケージを使用して、グループ化された大量のデータを処理しようとしています。データ (ffdf テーブル形式) は次のようになります。

x = 

id_1    id_2    month    year    Amount    key
   1      13        1    2013     -200      11
   1      13        2    2013      300      54
   2      19        1    2013      300      82
   3      33        2    2013      300      70

.... (10+ Million rows)

一意のキーは、次のようなものを使用して作成されます。

x$key = as.ff(as.integer(ikey(x[c("id_1","id_2","month","year")])))

キー変数を使用してグループ化して要約すると、次のコマンドがあります。

summary = ffdfdply(x=x, split=x$key, FUN=function(df) {
  df = data.table(df)
  df = df[,list(id_1 = id_1[1], withdraw = sum(Amount*(Amount>0),na.rm=T), by = "key"]
  df
},trace=T)

data.table の優れたグループ化機能を使用する (このディスカッションから得たアイデア)。実際のコードでは、Amount 変数に適用する関数がさらにありますが、これでも ffdf テーブル全体を処理することはできません (テーブルの小さなサブセットは正常に機能します)。

ffdfdplyis が大量の RAM を使用しているようで、次のようになります。

Error: cannot allocate vector of size 64MB

また、BATCHBYTES も役に立たないようです。ffdffply の経験がある人は、ffdf テーブルを事前にチャンクに分割せずに、これを行う他の方法を推奨できますか?

4

1 に答える 1

5

ff/ffbase を使用する際の最も難しい部分は、データが ff にとどまり、誤って RAM に置かれないようにすることです。一度データを RAM に配置すると (主に、いつデータが RAM に配置され、いつ配置されないかについての誤解が原因で)、R から RAM を取り戻すのは難しく、RAM の制限に取り組んでいる場合は、 RAM のわずかな追加要求により、「エラー: サイズのベクトルを割り当てることができません」というメッセージが表示されます。

さて、ikey への入力を誤って指定したと思います。を見てください?ikey。入力引数として、いくつかの ff ベクトルではなく、ffdf が必要です。おそらく、これはデータをRAMに入れましたが、あなたが望んでいたのはおそらく使用することですikey(x[c("id_1","id_2","month","year")])

次のように私のコンピューターでいくつかのデータをシミュレートして、24Mio行のffdfを取得しました.

require(ffbase)
require(data.table)
x <- expand.ffgrid(id_1 = ffseq(1, 1000), id_2 = ffseq(1, 1000), year = as.ff(c(2012,2013)), month = as.ff(1:12))
x$Amount <- ffrandom(nrow(x), rnorm, mean = 10, sd = 5)
x$key <- ikey(x[c("id_1","id_2","month","year")])
x$key <- as.character(x$key)
summary <- ffdfdply(x, split=x$key, FUN=function(df) {
  df <- data.table(df)
  df <- df[, list(
    id_1 = id_1[1], 
    id_2 = id_2[1],
    month = month[1],
    year = year[1],
    withdraw = sum(Amount*(Amount>0), na.rm=T)
  ), by = key]
  df
}, trace=TRUE)

もう 1 つの理由は、RAM に、話していない他のデータが多すぎることです。また、ff では、すべての因子レベルが RAM にあることに注意してください。大量の文字/因子データを扱っている場合、これも問題になる可能性があります。その場合、これらのデータが本当に必要かどうかを自問する必要があります。分析かどうか。

于 2013-08-16T08:19:49.883 に答える