R中的ffdfdply,分裂和内存限制

tan*_*ach 2 memory grouping r ffbase data.table

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

使用以下内容创建唯一键:

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

要通过使用键变量进行分组来总结,我有以下命令:

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)
Run Code Online (Sandbox Code Playgroud)

使用data.table的优秀分组功能(从这个讨论中获得的想法).在实际代码中有更多的函数要应用于Amount变量,但即使这样我也无法处理完整的ffdf表(表的一个较小的子集工作正常).

似乎ffdfdplyis使用了大量的ram,给出了:

Error: cannot allocate vector of size 64MB
Run Code Online (Sandbox Code Playgroud)

BATCHBYTES似乎没有帮助.任何有ffdffply经验的人都可以推荐任何其他方法来解决这个问题,而无需预先将ffdf表拆分成块?

小智 5

使用ff/ffbase最困难的部分是确保你的数据保持在ff而不是意外地将它放在RAM中.因为一旦你将你的数据放入RAM中(主要是由于对数据放入RAM的时间有些误解而不是这样),很难从R中恢复你的RAM并且如果你正在处理你的RAM限制,一个小额外的RAM请求将得到你的'错误:无法分配大小的矢量'.

现在,我想你错过了ikey的输入.看?ikey,它需要输入参数ffdf,而不是几个ff向量.可能这会将您的数据放入RAM中,而您可能需要使用它ikey(x[c("id_1","id_2","month","year")])

它模拟了我的计算机上的一些数据如下,以获得24Mio行的ffdf,以下不会给我带来RAM问题(它在我的机器中使用大约3.5Gb的RAM)

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)
Run Code Online (Sandbox Code Playgroud)

另一个原因可能是您在RAM中有太多其他数据,而您没有谈论这些数据.另请注意,在ff中,所有因子级别都在RAM中,如果您正在使用大量字符/因子数据,这也可能是一个问题 - 在这种情况下,您需要问自己是否真的需要这些数据分析与否.