首页 > 解决方案 > 传播非常长的数据集 - 性能问题

问题描述

我正在尝试通过具有约 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)

有什么想法可以完成吗?更高效的编码?

标签: rperformancedplyrspread

解决方案


在我看来,您正在尝试创建 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 中。


推荐阅读