Anche se avevo letto da qualche parte (non ricordo dove) quei fattori non erano effettivamente più efficienti dei vettori di caratteri in data.table. È vero? Stavo discutendo se continuare a utilizzare i fattori per memorizzare vari vettori in data.table. Un test approssimativo con object.size
sembra indicare il contrario.I fattori sono memorizzati in modo più efficiente in data.table dei caratteri?
chars <- data.table(a = sample(letters, 1e5, TRUE)) # chars (not really)
string <- data.table(a = sample(state.name, 1e5, TRUE)) # strings
fact <- data.table(a = factor(sample(letters, 1e5, TRUE))) # factor
int <- data.table(a = sample(1:26, 1e5, TRUE)) # int
mbs <- function(...) {
ns <- sapply(match.call(expand.dots=TRUE)[-1L], deparse)
vals <- mget(ns, .GlobalEnv)
cat('Sizes:\n',
paste('\t', ns, ':', round(sapply(vals, object.size)/1024/1024, 3), 'MB\n'))
}
## Get approximate sizes?
mbs(chars, string, fact, int)
# Sizes:
# chars : 0.765 MB
# string : 0.766 MB
# fact : 0.384 MB
# int : 0.382 MB
Altri che leggono questa domanda potrebbero essere interessati al comportamento generale di R; secondo Hadley Wickham, "R ha un pool di stringhe globale: ciò significa che ogni stringa univoca viene memorizzata solo in un posto, e quindi i vettori di caratteri occupano meno memoria di quanto ci si potrebbe aspettare". Vedi http://adv-r.had.co.nz/memory.html. – Aaron