加入超过2 ^ 31行的结果(内部vecseq达到物理限制)

时间:2013-08-07 11:20:20

标签: r merge data.table

我只是尝试在具有64G ram的计算机上合并R 3.0.1中的两个表,并出现以下错误。帮助将不胜感激。 (data.table版本是1.8.8)

以下是我的代码:

library(parallel)
library(data.table)

data1:数百万行和3列。列为tagprodvtag有750K唯一值,每prod个{1}} tagprod可能有5000个值。 v具有任何积极的实际价值。

setkey(data1, tag)
merge (data1, data1, allow.cartesian=TRUE)

我收到以下错误:

  

vecseq中的错误(f_ ,len _,if(allow.cartesian)NULL else as.integer(max(nrow(x),:     加入超过2 ^ 31行的结果(内部vecseq达到物理限制)。很可能是错误的加入。检查i中的重复键值,每个键值一遍又一遍地连接到x中的同一组。如果没关系,请尝试包括j并删除by(by-without-by),以便为每个组运行j以避免大量分配。否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议。   电话:合并 - > merge.data.table - > [ - > [.data.table - > vecseq

显示by-without-by

的新示例
country = fread("
country product share
1 5 .2
1 6 .2
1 7 .6
2 6 .3
2 7 .1
2 8 .4
2 9 .2
")
prod = fread("
prod period value
5 1990 2
5 1991 3
5 1992 2
5 1993 4
5 1994 3
5 1995 5
6 1990 1
6 1991 1
6 1992 0
6 1993 4
6 1994 8
6 1995 2
7 1990 3
7 1991 3
7 1992 3
7 1993 4
7 1994 7
7 1995 1
8 1990 2
8 1991 4
8 1992 2
8 1993 4
8 1994 2
8 1995 6
9 1990 1
9 1991 2
9 1992 4
9 1993 4
9 1994 5
9 1995 6
")

似乎完全不可能选择共享国家标签的市场子集,找到这些对中的协方差,并按国家整理那些而不会超出规模限制。 到目前为止,这是我最好的镜头:

setkey(country,country)
setkey(prod, prod, period)
covars <- setkey(setkey(unique(country[country, allow.cartesian=T][, c("prod","prod.1"), with=F]),prod)[prod, allow.cartesian=T], prod.1, period)[prod, ] [ , list(pcov = cov(value,value.1)), by=list(prod,prod.1)] # really long oneliner that finds unique market pairs from the the self-join, merges it with the second table and calculates covariances from the merged table.
clevel <-setkey(country[country, allow.cartesian = T], prod, prod.1)[covars, nomatch=0][ , list(countryvar = sum(share*share.1*pcov)), by="country"]
> clevel
   country countryvar
1:       1   2.858667
2:       2   1.869667

当我针对任何合理大小的数据尝试此方法时,我遇到了vecseq错误。如果data.table在2 ^ 31的限制上没有这么多,那将是非常好的。我是包的粉丝。关于如何使用更多j规范的建议也将受到赞赏。 (鉴于我必须从两个数据表的交集计算差异,我不知道如何尝试J规范。)

2 个答案:

答案 0 :(得分:2)

R 3.0.1 支持长度大于2 ^ 31 - 1的对象。虽然基础R附带的软件包已经可以创建这样的对象,但是贡献的软件包是否可以做同样的事情取决于包。基本上,任何使用编译代码的包都必须重新编译并可能被修改以利用此功能。

另外,假设64GB RAM足以与60GB对象一起使用,这是一种乐观的态度。

答案 1 :(得分:2)

这种联合确实似乎是错误的。一般来说,我认为,一个表与单列键的自连接可能总是错误指定。请考虑以下示例:

> DT
   A B
1: 1 5
2: 1 6
3: 1 7
4: 2 8
5: 2 9
> setkey(DT,A)

A(1和2)有2个唯一值,但它们在A列中重复出现。关键是一列。

> DT[DT]   # the long error message

> DT[DT, allow.cartesian=TRUE]  # **each row** of DT is self joined to DT
    A B B.1
 1: 1 5   5
 2: 1 6   5
 3: 1 7   5
 4: 1 5   6
 5: 1 6   6
 6: 1 7   6
 7: 1 5   7
 8: 1 6   7
 9: 1 7   7
10: 2 8   8
11: 2 9   8
12: 2 8   9
13: 2 9   9

这真的是你需要的结果吗?更有可能的是,需要通过向密钥添加更多列来更改查询,而不是执行by,不执行自联接或错误消息中的提示。

有关合并后需要实现的更多信息(更大的图片)可能会有所帮助。

“包括j和丢弃(by-without-by)的示例,以便j为每个组运行以避免大量分配”(参见有问题的错误消息)

现在有问题的例子(协方差)通常用矩阵而不是data.table完成。但无论如何要继续快速演示,只需将其用作示例数据......

require(data.table)
country = fread("
Country Product
1 5
1 6
1 7
2 6
2 7
2 8
2 9
")
prod = fread("
Prod1 Prod2 Covariance
5 5 .4
5 6 .5
5 7 .6
5 8 -.3
5 9 -.1
6 6 .3
6 7 .2
6 8 .4
6 9 -.2
7 7 .2
7 8 .1
7 9 .3
8 8 .1
8 9 .6
9 9 .01
")

country
   Country Product
1:       1       5
2:       1       6
3:       1       7
4:       2       6
5:       2       7
6:       2       8
7:       2       9
prod
    Prod1 Prod2 Covariance
 1:     5     5       0.40
 2:     5     6       0.50
 3:     5     7       0.60
 4:     5     8      -0.30
 5:     5     9      -0.10
 6:     6     6       0.30
 7:     6     7       0.20
 8:     6     8       0.40
 9:     6     9      -0.20
10:     7     7       0.20
11:     7     8       0.10
12:     7     9       0.30
13:     8     8       0.10
14:     8     9       0.60
15:     9     9       0.01

setkey(country,Country)
country[country,{print(.SD);print(i.Product)}]
# included j to demonstrate j running for each row of i. Just printing to demo.
   Product
1:       5
2:       6
3:       7
[1] 5
   Product
1:       5
2:       6
3:       7
[1] 6
   Product
1:       5
2:       6
3:       7
[1] 7
   Product
1:       6
2:       7
3:       8
4:       9
[1] 6
   Product
1:       6
2:       7
3:       8
4:       9
[1] 7
   Product
1:       6
2:       7
3:       8
4:       9
[1] 8
   Product
1:       6
2:       7
3:       8
4:       9
[1] 9
Empty data.table (0 rows) of 2 cols: Country,Product

setkey(prod,Prod1,Prod2)
country[country,prod[J(i.Product,Product),Covariance,nomatch=0]]
    Country Prod1 Prod2 Covariance
 1:       1     5     5       0.40
 2:       1     5     6       0.50
 3:       1     5     7       0.60
 4:       1     6     6       0.30
 5:       1     6     7       0.20
 6:       1     7     7       0.20
 7:       2     6     6       0.30
 8:       2     6     7       0.20
 9:       2     6     8       0.40
10:       2     6     9      -0.20
11:       2     7     7       0.20
12:       2     7     8       0.10
13:       2     7     9       0.30
14:       2     8     8       0.10
15:       2     8     9       0.60
16:       2     9     9       0.01

country[country, prod[J(i.Product,Product),Covariance,nomatch=0][
    ,mean(Covariance),by=Country]
   Country        V1
1:       1 0.3666667
2:       2 0.2010000

由于关闭对角线不加倍,这与期望的结果不匹配。但希望这足以证明问题中的错误消息中的特定建议,您可以从这里开始。或者使用matrix而非data.table进行协方差类型工作。