问题描述
问题。我正在 Windows x64
机器上处理大型数据集(数百万行),其中许多列是字符串标识符(想想“AEREOBCOIRE045451O34”)。我使用 data.table
包。这些变量在 unique(x)/length(x)
意义上具有低基数。此外,其中一些来自不同的数据集,因此我可以在合并之前有效地将它们转换为因子。
根据对 this question 的回答,我之前认为我应该始终使用 character
类型的标识符。不过
- The comment by @MichaelChirico here 表明这不完全是 再这样下去了。
- 当我将这些标识符从
character
转换为factor
时,我的数据集的大小显着下降。在下面的可重现示例中,内存使用量增加了 20%。
问题。鉴于下面的可重现示例,从切换到 factor
类型标识符在内存方面有显着的收益。使用 factor
变量是否与我应该注意的 character
包中基于 data.table
的优化冲突?
附加上下文。characters
与 factors
的问题已在 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 (将#修改为@)