2012-11-26 33 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()',並想知道結果。似乎在某些情況下仍然可能派上用場。 –