3

これに対する解決策を探し回っていますが、何も見つからないようです。

基本的に、大規模なデータにスケールアップしようとしているコードがあります。コードのサンプルの抜粋を以下に示します。

num_train <- 100
num_test <- 100

train <- data.table(k = rep(1,num_train), ID_train = 1:num_train, b_train = rnorm(num_train), c_train = rnorm(num_train), cat = sample(c("A", "B", "C", "D"), num_train, replace = TRUE))
test <- data.table(k = rep(1,num_test), ID_test = 1:num_test, b_test = rnorm(num_test), c_test = rnorm(num_test))

df <- merge(test,train, by="k")

これは、私が望むとおりに実行され、より大きなデータで使用すると非常に高速になります。(たぶん num_train * num_test = 2,000,000,000 と同じくらい大きい...)

ただし、問題は、結果のデータ テーブルが num_train*num_test 行だけ大きくなるため、R が処理するにはすぐに大きすぎることです。

num_train <- 1000
num_test <- 10000

train <- data.table(k = rep(1,num_train), ID_train = 1:num_train, b_train = rnorm(num_train), c_train = rnorm(num_train), cat = sample(c("A", "B", "C", "D"), num_train, replace = TRUE))
test <- data.table(k = rep(1,num_test), ID_test = 1:num_test, b_test = rnorm(num_test), c_test = rnorm(num_test))

df <- merge(test,train, by="k")

>Error: cannot allocate vector of size 76.3 Mb

私は、R と、filehash、ff、bigmemory などのパッケージのすべてのメモリ制約を認識しています (あまりよく知られていませんが、それらのいくつかを少し使用したことがあります)。これらにより、大きなファイルをデータベースとして設定し、それらからデータを効率的に読み取ることができるようです。

しかし、基本的に私が疑問に思っているのは、作成時にハードディスクにビットを書き込むなど、すでにメモリ内にあるテーブルから大きなテーブルを作成する方法はありますか? これらのパッケージのいずれかがこれで機能しますか? 他の解決策はありますか?

それとも、この仕事は R 向けではないのでしょうか?

乾杯!

4

1 に答える 1

3

これには、パッケージffおよびffbaseを使用できます。data.tableの場合のように、データがRAMにある必要はありません。次のスクリプトは、10Mio行x1​​0列のdata.frameを生成します。

num_train <- 1000
num_test <- 10000
train <- data.table(k = rep(1,num_train), ID_train = 1:num_train, b_train =     rnorm(num_train), c_train = rnorm(num_train), cat = sample(c("A", "B", "C", "D"), num_train,     replace = TRUE))
test <- data.table(k = rep(1,num_test), ID_test = 1:num_test, b_test = rnorm(num_test),     c_test = rnorm(num_test))


train <- data.frame(unclass(train), stringsAsFactors=TRUE)
test <- data.frame(unclass(test), stringsAsFactors=TRUE)
require(ffbase)
train$id <- seq_len(nrow(train))
test$id <- seq_len(nrow(test))
train <- as.ffdf(data.frame(train, stringsAsFactors=TRUE))
test <- as.ffdf(data.frame(test, stringsAsFactors=TRUE))
x <- expand.ffgrid(train$id, test$id)
dim(x)
names(x) <- c("train.id", "test.id")
x <- merge(x, train, by.x="train.id", by.y="id", all.x=TRUE, all.y=FALSE)
x <- merge(x, test, by.x="test.id", by.y="id", all.x=TRUE, all.y=FALSE)
dim(x)
x[1:5, ]
于 2012-11-21T19:12:38.777 に答える