R 传播非常长的数据集-性能问题
我正试图通过一个具有~2000个唯一值的变量将一个很长的数据帧(17000000行;111.2MB RDS文件)扩展为一个宽格式。在16核64GB RAM linux机器上运行此操作会导致R 传播非常长的数据集-性能问题,r,performance,dplyr,spread,R,Performance,Dplyr,Spread,我正试图通过一个具有~2000个唯一值的变量将一个很长的数据帧(17000000行;111.2MB RDS文件)扩展为一个宽格式。在16核64GB RAM linux机器上运行此操作会导致错误:无法分配大小为3132.3GB的向量 下面的dplyr代码可以在较小的数据集(约1/3大小)上完美工作 数据% rowid_到_列()%>% 排列(键=参数\名称,值=值)%>% 选择(-rowid) 有什么办法完成这件事吗?更高效的编码?数据表转换更高效、更快,尽管dplyr更方便 在我看来,您正在尝
错误:无法分配大小为3132.3GB的向量
下面的dplyr
代码可以在较小的数据集(约1/3大小)上完美工作
数据%
rowid_到_列()%>%
排列(键=参数\名称,值=值)%>%
选择(-rowid)
有什么办法完成这件事吗?更高效的编码?数据表转换更高效、更快,尽管dplyr更方便 在我看来,您正在尝试创建17e6 x 2000 data.frame,这是非常不合理的(因为每行只有一个值)
如果您的值为整数,则结果data.frame的大小为:
v <- sample.int(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "126.7 Gb"
v能否提供一些数据来运行代码?您是否尝试过使用{data.table}的等效解决方案?似乎相关:正如@markus'链接中的一条注释所建议的(公平地说,是我的注释):如果您的数据相当大,可能需要拆分,分别重塑每个元素,然后以某种方式重新组合。在重新组合时,必须注意确保列和行正确对齐,但这在大范围内是最小的努力。您也可以尝试使用widyr
包
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"
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"