2012-07-20 13 views
17

Podczas korzystania z pakietu data.table, nie jestem pewien, kiedy muszę setkey(). Na przykład, używając operatora := z opcją by, rzeczy wydają się nadal bardzo szybkie, mimo że nie ustawiłem klucza. Czy ktoś może wyjaśnić, kiedy setkey() jest konieczne, a kiedy nie jest? A jeśli nie jest to konieczne przed wywołaniem := z by, to jak jest tak szybko, ponieważ pakiet data.table jest tak szybki, ponieważ prawdopodobnie musi zrobić to samo co apply w standardzie data.frame R, wykonując wyszukiwanie sekwencyjne, a nie binarne, ponieważ nie wiem, czy mój data.table jest rzeczywiście posortowany według argumentu do by.setkey i: = operator, data.table, R

Dzięki

Odpowiedz

18

Te 2 Najczęściej zadawane pytania wydają blisko:

3,2 Nie mam klucza na dużym stole, ale grupa nadal jest bardzo szybki. Dlaczego?
data.table używa sortowania radix. Jest to znacznie szybsze niż inne algorytmy sortowania. Radix jest specjalnie dla liczb całkowitych, patrz ?base::sort.list(x,method="radix"). Jest to również jeden z powodów, dla których setkey jest szybki. Gdy żaden klucz nie jest ustawiony lub grupujemy w innej kolejności niż klucz, nazywamy go ad hoc przez.

3.3 Dlaczego grupowanie według kolumn w kluczu jest szybsze niż ad hoc?
Ponieważ każda grupa jest ciągły w pamięci RAM, w ten sposób minimalizując strony pobiera i pamięć mogą być kopiowane w masie (memcpy na etapie C) zamiast pętli w C.

co nie znaczy, i prawdopodobnie należy to, że potrzebujesz bardzo dużego zestawu danych, gdzie każda grupa jest bardzo duża, zanim zauważysz różnicę między kluczem a doraźnym. Coś jak 100 grup po 100 MB (10 GB danych), takich jak 1e8 wierszy i 13 kolumn. W przeciwnym razie nie ma potrzeby, aby setkey po raz pierwszy, zwłaszcza, że ​​może stać się uciążliwe.

+1

fantastyczne, dziękuję! przeszukiwał FAQ i musiał tego nie zauważyć. – Alex

+0

Czy "ad hoc by" jest szybkie, ponieważ używa sortowania radix? – colinfang

+1

@colinfang Trudno odpowiedzieć na to pytanie, ponieważ wchodzi w to kilka funkcji. Przyczyny różnią się w zależności od zapytania i danych. Ad hoc 'by' używa sortowania radix do znalezienia grup dla kolumn całkowitych, więc zależy to od typu i liczby kolumn" po "-ed. Po znalezieniu grup, jedna grupa przyczyn jest szybka, ponieważ pamięć jest przydzielana dla największej grupy raz z góry, która jest następnie ponownie wykorzystywana dla wszystkich grup. I tylko dla kolumn wymaganych przez 'j'. Zobacz FAQ 3.1. Spróbuj trybu 'verbose = TRUE', ponieważ pokazuje, ile czasu poświęcamy na znajdowanie grup (sortowanie radix) i ich powtarzanie. –