我有一个2.5 GB的数据集,这是我的4GB内存相当大。我想知道如果将字符变量转换为因子将节省空间和处理时间。转换字符列为因素可节省内存吗?
我可以想象内部的因素将被存储在数字与平的查找表。但我不确定它是如何工作的。
我有一个2.5 GB的数据集,这是我的4GB内存相当大。我想知道如果将字符变量转换为因子将节省空间和处理时间。转换字符列为因素可节省内存吗?
我可以想象内部的因素将被存储在数字与平的查找表。但我不确定它是如何工作的。
转换为因素不会节省空间,因为字符存储在一个哈希表。请参阅R Internals的1.10 The CHARSXP cache。
转换为因素可以提高处理时间,如果你的代码就需要转换成因子(运行回归,分类等),但它不会提高处理时间,如果你正在做的字符串操作,因为它会将因素转换回一个字符。所以这取决于你在做什么。
存储分类数据的因素,而不是作为特征向量写入数据时磁盘不会节省空间:
## Create 2 two-million length vectors, one character and one factor
animalsChar <- c(rep("giraffe", 1e6), rep("pygmy chimpanzee", 1e6))
animalsFac <- factor(animalsChar)
## Save them to two ".Rdata" files
charFile <- "char.Rdata"
facFile <- "fac.Rdata"
save(animalsChar, file = "char.Rdata")
save(animalsFac, file = "fac.Rdata")
## Compare the sizes of the two files
file.info("char.Rdata", "fac.Rdata")["size"]
# size
# char.Rdata 87390
# fac.Rdata 7921
## Clean up
unlink(c("char.Rdata", "fac.Rdata"))
RAM中的空间和HDD上的空间不同。检查'print(object.size(animalsChar),units =“Mb”)'。 –
@JoshuaUlrich - 感谢您的解释。我曾尝试过'object.size()',并想知道结果。似乎在某些情况下仍然可能派上用场。 –
你即将因素的存储方式是正确的。但节省的空间取决于要转换的字符串的数量和字符串的长度。你也可能想看看一些大数据包,比如'ff'。 – Justin
转换为factor不会节省空间,因为字符存储在散列表中。转换为因子可能会缩短处理时间 - 如果您正在做的任何事情都会将角色转换为因子 - 但这取决于您正在做的事情。 –
非常感谢Joshua。并感谢贾斯汀指出ff包。 – AdamNYC