【问题标题】:ffdfdply, splitting and memory limit in RR中的ffdfdply,拆分和内存限制
【发布时间】:2013-08-18 06:00:52
【问题描述】:

我在使用 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")])))

通过使用 key 变量进行分组来总结,我有这个命令:

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 出色的分组功能(想法来自this discussion)。在实际代码中,有更多函数可应用于 Amount 变量,但即使这样我也无法处理完整的 ffdf 表(表的较小子集可以正常工作)。

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

Error: cannot allocate vector of size 64MB

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

【问题讨论】:

    标签: r memory grouping data.table ffbase


    【解决方案1】:

    使用 ff/ffbase 最困难的部分是确保您的数据保留在 ff 中,而不是意外将其放入 RAM。因为一旦您将数据放入 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)
    

    另一个原因可能是您在 RAM 中的其他数据过多,而您并未提及。还要标记在 ff 中,您的所有因子级别都在 RAM 中,如果您正在处理大量字符/因子数据,这也可能是一个问题 - 在这种情况下,您需要问自己是否真的需要这些数据分析与否。

    【讨论】:

    • 您对 ikey 的看法是正确的,我在问题中输入错误。我一直在按照你的方式使用它,虽然它是通过 as.integer 而不是 as.character。以上已更正。
    • 我认为问题在于,自从我使用 ffsave/ffload 以来,我保留了太多的列,拥有大量 ff 数据集需要很长时间。我取出的列是键控变量(有 4 个键控列)。现在,必须为每个分组再次进行键控,虽然不理想,但至少数据适合内存。
    • 总之: - 不要使用因子。它会减慢一切。 - 保留尽可能少的列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2011-03-21
    • 2013-12-15
    • 1970-01-01
    • 2016-10-19
    相关资源
    最近更新 更多