我应该在大型 data.table 数据集中使用因子还是字符作为标识符?

问题描述

问题。我正在 Windows x64 机器上处理大型数据集(数百万行),其中许多列是字符串标识符(想想“AEREOBCOIRE045451O34”)。我使用 data.table 包。这些变量在 unique(x)/length(x) 意义上具有低基数。此外,其中一些来自不同的数据集,因此我可以在合并之前有效地将它们转换为因子。

根据对 this question 的回答,我之前认为我应该始终使用 character 类型的标识符。不过

  1. The comment by @MichaelChirico here 表明这不完全是 再这样下去了。
  2. 当我将这些标识符从 character 转换为 factor 时,我的数据集的大小显着下降。在下面的可重现示例中,内存使用量增加了 20%。

问题。鉴于下面的可重现示例,从切换到 factor 类型标识符在内存方面有显着的收益。使用 factor 变量是否与我应该注意的 character 包中基于 data.table 的优化冲突?

加上下文。charactersfactors 的问题已在 Stack Overflow 上进行了大量讨论(参见例如 here (1)、{{3} } 或 here (2);还有很多其他的)但所提供的建议随着时间的推移不断发展,有时会相互矛盾。鉴于我在大型数据集上面临此问题,因此了解当前问题的状态对我(以及其他人)非常有用。

可重现的内存使用示例。

library(data.table)
library(pryr)
set.seed(1234)

N <- 1e7
vec_id <- stringi::stri_rand_strings(100,40)
id_lowcard <- sample(vec_id,size = N,replace = TRUE)
v1 <- runif(N)
v2 <- rnorm(N)

A <- data.table(id_lowcard,v1,v2)
B <- data.table(as.factor(id_lowcard),v2)

cat("Memory gain: ",round((object_size(A) / object_size(B) - 1) * 100),"%")

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)