使用大量逻辑变量减少data.table的内存占用

时间:2017-01-27 15:18:37

标签: r boolean data.table dplyr bit

我有一个大的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:添加代码以模拟聚合过程

0 个答案:

没有答案