我正在尝试通过一个具有约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)
有什么想法可以做到吗?更有效的编码?
答案 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)
data.table转换具有更高的内存效率和更快的速度。