我有一个大的data.table,它变得非常大(> 1TB)并且开始不适合我服务器的RAM(~1TB的RAM)。
该文件具有人员和家庭标识符以及大量逻辑指示符变量(~120)。数据用于生成报告,由data.table和dplyr函数聚合。
例如:
library(dplyr)
library(data.table)
n_obs=100000 # just for a manageable example, actual dataset has ~ 1.5e+09 rows
n_vl=120
number <- seq_len(length.out = n_vl)
names_var <- paste0("var_", 1:n_vl)
d <- data.table(
person_id = 1:n_obs,
family_id=(1:n_obs)/2 %>% floor
)
for(i in 1:length(names_var)){
d[,names_var[i]] <- c(TRUE,FALSE) %>% sample(n_obs,TRUE)
}
# Aggregating
by_vars <- c('family_id', paste0("var_", 1:5) )
sum_vars <- paste0("var_", 6:n_vl)
d[,lapply(.SD, function(x) sum(x,na.rm = T)),
by=by_vars,
.SDcols=sum_vars] -> d_agg
在探讨内存解决方案之前,我想减少数据的内存占用。特别是,逻辑变量在R中占用4个字节。也许其他一些变量类型(bit64
包)可以提供帮助。
这方面的最新状态是什么?
使用bit
(或其他形式的紧凑型布尔值)是否有任何其他权衡(内存使用与速度)?
data.table和dplyr函数是否支持位格式?可以汇总,汇总等吗?
Edit1:添加代码以模拟数据 Edit2:添加代码以模拟聚合过程