传播非常长的数据集-性能问题

时间:2019-04-09 18:34:28

标签: r performance dplyr spread

我正在尝试通过一个具有约2,000个唯一值的变量将一个非常长的数据帧(17,000,000行; 111.2MB RDS文件)扩展为一个宽格式。在16核64GB RAM的Linux机器上运行此命令将产生Error: cannot allocate vector of size 3132.3GB

下面的dplyr代码在较小的数据集(大约1/3的数据集)上可以很好地工作。

data <- data %>%
  rowid_to_column() %>%
  spread(key = parameter_name, value = value) %>%
  select(-rowid)

有什么想法可以做到吗?更有效的编码?

2 个答案:

答案 0 :(得分:0)

在我看来,您正在尝试创建17e6 x 2000 data.frame,这是非常不合理的(因为每一行只有一个值)。

如果您的值是整数,则结果data.frame将具有以下大小:

v <- sample.int(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "126.7 Gb"

或两倍:

v <- rnorm(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "253.3 Gb"

您也许应该研究稀疏矩阵或重新考虑您的工作。

具有data.table的200k x 2000的测试用例:

N <- 200000
n <- 2000
require(data.table)
dt <- data.table(parameter_name = sample.int(n, N, T), value = rnorm(N), id = 1:N)
r <- dcast(dt, id ~ parameter_name)
format(object.size(r), units = 'Gb')
# [1] "3 Gb"

结果已经有3GB。

答案 1 :(得分:-3)

尽管pplyr更方便,但

data.table转换具有更高的内存效率和更快的速度。