2012-07-20 15 views
17

Quando si utilizza il pacchetto data.table, sono un po 'insicuro di quando ho bisogno di setkey(). Ad esempio, quando si utilizza l'operatore := con l'opzione by, le cose sembrano essere molto veloci anche se non ho impostato una chiave. Qualcuno potrebbe chiarire quando è necessario setkey() e quando non lo è? E se non è necessario prima di chiamare con by, allora come è veloce il pacchetto data.table poiché presumibilmente deve fare la stessa cosa di apply nello standard data.frame R eseguendo una ricerca sequenziale anziché una binario poiché non sapere se il mio data.table è effettivamente ordinato per argomento a by.setkey e: = operator, data.table, R

Grazie

risposta

18

Questi 2 FAQs sembrare vicino:

3,2 Non ho un tasto su un grande tavolo, ma il raggruppamento è ancora molto veloce. Perché?
data.table utilizza l'ordinamento digitale. Questo è significativamente più veloce di altri algoritmi di ordinamento. Radix è specifico solo per numeri interi, vedere ?base::sort.list(x,method="radix"). Questo è anche uno dei motivi per cui lo setkey è veloce. Quando non viene impostata alcuna chiave o ci raggruppiamo in un ordine diverso da quello della chiave, la chiamiamo ad hoc da.

3.3 Perché il raggruppamento per colonne nella chiave è più veloce di un ad hoc di?
Poiché ogni gruppo è contiguo nella RAM, minimizzando pagina recupera e memoria può essere copiata in massa (memcpy in C) anziché loop in C.

Quello che non dice, e probabilmente dovrebbe è che hai bisogno di un set di dati molto grande, in cui ogni gruppo è anche molto grande, prima di notare la differenza tra con chiave e ad hoc di. Qualcosa come 100 gruppi di 100 MB ciascuno (un data.table da 10 GB) come 1e8 righe e 13 colonne. Altrimenti, non è necessario prima il numero setkey, soprattutto perché può diventare oneroso.

+1

fantastico, grazie! stava scavando attraverso le FAQ e deve aver perso questo. – Alex

+0

'ad hoc by' è veloce perché usa anche l'ordinamento radix? – colinfang

+1

@colinfang Difficile rispondere a questa domanda poiché sono presenti diverse funzionalità. I motivi variano in base a query e dati. Ad hoc 'by' usa l'ordinamento digitale per trovare i gruppi per le colonne intere, quindi dipende dal tipo e dal numero di colonne che vengono" by'-ed ". Quindi, una volta individuati i gruppi, un motivo per cui il raggruppamento è veloce è perché la memoria viene allocata per il gruppo più grande una volta in primo piano, che viene quindi riutilizzata per tutti i gruppi. E solo per le colonne necessarie per 'j'. Vedi FAQ 3.1. Prova la modalità 'verbose = TRUE' perché rivela quanto tempo è trascorso a trovare i gruppi (inc radix sort) vs iterandoli. –