数据表中的内存限制:不允许使用负长度向量

时间:2016-04-25 13:38:42

标签: r data.table bigdata

我有一个包含多个社交媒体用户和他/她的粉丝的数据表。原始数据表格式如下:

X.USERID FOLLOWERS
1081     4053807021,2476584389,4713715543, ...

因此每行包含一个用户以及他/她的ID和一组粉丝(用逗号分隔)。总共有24,000个唯一身份用户ID和160,000,000个独立粉丝。我希望以下列格式转换原始表:

X.USERID          FOLLOWERS
1:     1081         4053807021
2:     1081         2476584389
3:     1081         4713715543
4:     1081          580410695
5:     1081         4827723557
6:     1081 704326016165142528

为了得到这个数据表,我使用了以下代码行(假设我的原始数据表叫做dt):

uf <- dt[,list(FOLLOWERS = unlist(strsplit(x = FOLLOWERS, split= ','))), by = X.USERID]

然而,当我在整个数据集上运行此代码时,我收到以下错误:

不允许使用负长度向量

根据关于堆栈溢出(Negative number of rows in data.table after incorrect use of set)的这篇文章,我似乎碰到了data.table中列的内存限制。作为一种解决方法,我以较小的块(每10,000个)运行代码,这似乎有效。

我的问题是:如果我更改了我的代码,我是否可以防止出现此错误,或者我是否碰到R的限制?

PS。我有一台140GB RAM的机器,所以物理内存空间应该不是问题。

> memory.limit()
[1] 147446

1 个答案:

答案 0 :(得分:0)

当数据集中的行数超过R的限制为2 ^ 32-1时,会出现此问题。  处理此问题的方法之一是以块(在循环内)读取数据集。 看起来您的文件按X.USERID字段排序,因此您的块(当您读取文件时)应该与唯一关注者的数量重叠,以确保每个用户属于至少一个包含所有关注者的块。 处理这些块的方式在很大程度上取决于您需要对数据执行的操作。