【问题标题】:Memory limits in data table: negative length vectors are not allowed数据表中的内存限制:不允许负长度向量
【发布时间】:2016-08-18 22:39:09
【问题描述】:

我有一个包含多个社交媒体用户及其关注者的数据表。原始数据表格式如下:

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

【问题讨论】:

  • 您可以尝试寻找 strsplit 的替代品,因为这可能是您查询效率最低的部分。
  • stringi 包中的stri_split 在我对一个具有 100 个 ID 和每个 ID 100,000 个关注者的虚假数据文件进行测试时,速度提高了大约 3 倍。
  • “关注者”的总数比唯一关注者更重要...您的 140 GB 可能在您加载初始表之前就被炸毁了

标签: r data.table bigdata


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-02-08
  • 2019-10-14
  • 1970-01-01
  • 2021-11-11
  • 2017-07-17
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多