我有一個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