r - 传播非常长的数据集 - 性能问题
问题描述
我正在尝试通过具有约 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)
有什么想法可以完成吗?更高效的编码?
解决方案
在我看来,您正在尝试创建 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 中。
推荐阅读
- reactjs - TypeError:path.resolve 不是函数
- modelica - Modelica - 过度约束的 Stewart 平台模型的内部错误
- c++ - 自定义类型的名称,即使是带有可变参数的模板
- sql-server - 使用 ASP.NET MVC 将 Excel 数据导入 SQL Server 的多个表
- tailwind-css - 用tailwindcss设计的通知包与bootstrap主题冲突
- r - 删除 R 中具有特定值的案例
- google-chrome - Chrome 插件 - 无需 webRequest API 即可监控请求
- node.js - nodejs:如何仅将重定向设置为 expressjs 上的基本 url?
- ruby-on-rails - 仅当创建或更新具有特定名称值的记录以及特定部分时,如何在 Rails 6(热线)中发送 broadcasts_to?
- c# - 如何使用 Twilio AMD 留下语音邮件?