2012-11-26 11 views
13

Mam zestaw danych 2,5 GB, który jest dość duży dla mojej pamięci 4 GB. Zastanawiam się, czy konwersja zmiennych postaci na czynniki pozwoli zaoszczędzić miejsce i czas przetwarzania.Czy konwertowanie kolumn znaków na czynniki oszczędza pamięć?

Wyobrażam sobie, że wewnętrznie czynniki będą przechowywane w postaci liczbowej z tabelą odnośników dla poziomów. Ale nie jestem pewien, jak to działa.

+0

Masz rację co do sposobu czynniki są przechowywane. Ale oszczędność miejsca zależy od liczby poziomów czynników i długości łańcuchów, które chcesz przekonwertować. Możesz również spojrzeć na niektóre duże pakiety danych, takie jak 'ff'. – Justin

+3

Konwersja na czynnik nie spowoduje zaoszczędzenia miejsca, ponieważ znaki są przechowywane w tabeli mieszającej. Konwersja na czynnik może wydłużyć czas przetwarzania - jeśli cokolwiek robisz, to i tak przekształci postać w czynnik - ale to naprawdę zależy od tego, co robisz. –

+0

Wielkie dzięki za jasne wyjaśnienie, Joshua. I dziękuję Justin za wskazanie ff paczki. – AdamNYC

Odpowiedz

12

Konwersja na czynnik nie spowoduje zaoszczędzenia miejsca, ponieważ znaki są przechowywane w tabeli mieszającej. Zobacz rozdział 1.10 The CHARSXP cache z R Internals.

Konwersja na czynnik może poprawić czas przetwarzania, jeśli kod musiałby zostać przekonwertowany na czynnik (z regresem, klasyfikacją itd.), Ale nie poprawi to czasu przetwarzania, jeśli manipulujesz ciągami, ponieważ aby przekonwertować czynnik z powrotem na postać. Więc to naprawdę zależy od tego, co robisz.

+0

Czy możesz rozwinąć swoje pierwsze zdanie? A może masz referencje, które zawierają szczegóły? – Dason

+0

@Dason: Dodano opracowanie. :) –

+0

Dziękujemy! Nie zdawałem sobie sprawy, że tak się stało, ale dobrze to wiedzieć. – Dason

6

Przechowywanie danych kategorycznych jak czynniki raczej niż jako wektory znaków ma zaoszczędzić miejsce podczas zapisywania danych na dysku:

## 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

Miejsce w pamięci RAM i miejsce na dysku HDD są różne. Sprawdź 'print (object.size (animalsChar), units =" Mb ")'. –

+0

@JoshuaUlrich - Dzięki za wyjaśnienie. Próbowałem najpierw 'object.size()' i zastanawiałem się nad jego wynikami. Wydaje się, że to może się jeszcze przydać w niektórych sytuacjach. –

Powiązane problemy