2012-11-26 34 views
13

我有一个2.5 GB的数据集,这是我的4GB内存相当大。我想知道如果将字符变量转换为因子将节省空间和处理时间。转换字符列为因素可节省内存吗?

我可以想象内部的因素将被存储在数字与平的查找表。但我不确定它是如何工作的。

+0

你即将因素的存储方式是正确的。但节省的空间取决于要转换的字符串的数量和字符串的长度。你也可能想看看一些大数据包,比如'ff'。 – Justin

+3

转换为factor不会节省空间,因为字符存储在散列表中。转换为因子可能会缩短处理时间 - 如果您正在做的任何事情都会将角色转换为因子 - 但这取决于您正在做的事情。 –

+0

非常感谢Joshua。并感谢贾斯汀指出ff包。 – AdamNYC

回答

12

转换为因素不会节省空间,因为字符存储在一个哈希表。请参阅R Internals1.10 The CHARSXP cache

转换为因素可以提高处理时间,如果你的代码就需要转换成因子(运行回归,分类等),但它不会提高处理时间,如果你正在做的字符串操作,因为它会将因素转换回一个字符。所以这取决于你在做什么。

+0

你能详细说明你的第一句话吗?或者你有参考提供细节? – Dason

+0

@Dason:详细说明。 :) –

+0

谢谢!我没有意识到它做到了,但很高兴知道。 – Dason

6

存储分类数据的因素,而不是作为特征向量写入数据时磁盘不会节省空间:

## 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")) 
+4

RAM中的空间和HDD上的空间不同。检查'print(object.size(animalsChar),units =“Mb”)'。 –

+0

@JoshuaUlrich - 感谢您的解释。我曾尝试过'object.size()',并想知道结果。似乎在某些情况下仍然可能派上用场。 –