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 行 x 10 列 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 回答