Sembra che Wes abbia scoperto un problema noto in data.table
quando il numero di stringhe ( livelli ) uniche è grande: 10.000.
Non Rprof()
rivelare la maggior parte del tempo speso nella chiamata sortedmatch(levels(i[[lc]]), levels(x[[rc]])
? Questo non è in realtà il join stesso (l'algoritmo), ma un passaggio preliminare.
Recenti sforzi sono stati fatti per consentire le colonne di caratteri nelle chiavi, che dovrebbero risolvere il problema integrandosi più da vicino con la tabella hash della stringa globale di R. Alcuni risultati di benchmark sono già riportati da test.data.table()
ma quel codice non è ancora collegato per sostituire i livelli con i livelli corrispondenti.
I panda si uniscono più velocemente rispetto data.table
alle normali colonne intere? Questo dovrebbe essere un modo per isolare l'algoritmo stesso rispetto ai problemi dei fattori.
Inoltre, data.table
ha in mente le serie temporali . Due aspetti: i) chiavi ordinate su più colonne come (id, datetime) ii) join prevalente ( roll=TRUE
) noto anche come ultima osservazione portata avanti.
Avrò bisogno di un po 'di tempo per confermare poiché è il primo che ho visto del confronto data.table
come presentato.
AGGIORNAMENTO da data.table v1.8.0 rilasciato luglio 2012
- Funzione interna sortmatch () rimossa e sostituita con chmatch () quando si abbinano i livelli a livelli x per colonne di tipo 'fattore'. Questo passaggio preliminare stava causando un rallentamento (noto) significativo quando il numero di livelli di una colonna fattoriale era elevato (ad esempio> 10.000). Esacerbato nei test di unione di quattro di queste colonne, come dimostrato da Wes McKinney (autore del pacchetto Pandas di Python). Ad esempio 1 milione di stringhe di cui 600.000 uniche è ora ridotto da 16 a 0,5 secondi.
anche in quella versione c'era:
le colonne di caratteri sono ora consentite nelle chiavi e sono da considerare come fattori. data.table () e setkey () non costringono più il carattere al fattore. I fattori sono ancora supportati. Implementa FR # 1493, FR # 1224 e (parzialmente) FR # 951.
Nuove funzioni chmatch () e% chin%, versioni più veloci di match () e% in% per i vettori di caratteri. Viene utilizzata la cache di stringa interna di R (non viene creata alcuna tabella hash). Sono circa 4 volte più veloci di match () nell'esempio in? Chmatch.
A partire da settembre 2013 data.table è v1.8.10 su CRAN e stiamo lavorando su v1.9.0. NEWS è aggiornato in tempo reale.
Ma come ho scritto in origine, sopra:
data.table
ha in mente le serie temporali . Due aspetti: i) chiavi ordinate su più colonne come (id, datetime) ii) join prevalente ( roll=TRUE
) noto anche come ultima osservazione portata avanti.
Quindi il panda equi join di due colonne di caratteri è probabilmente ancora più veloce di data.table. Dal momento che sembra che hash le due colonne combinate. data.table non esegue l'hashing della chiave perché ha in mente i join ordinati prevalenti. Una "chiave" in data.table è letteralmente solo il tipo di ordinamento (simile a un indice cluster in SQL; ovvero, è così che i dati vengono ordinati nella RAM). Nell'elenco è necessario aggiungere chiavi secondarie, ad esempio.
In sintesi, la differenza di velocità evidente evidenziata da questo particolare test della colonna di due caratteri con oltre 10.000 stringhe uniche non dovrebbe essere così grave ora, poiché il problema noto è stato risolto.
data.table
eredita dadata.frame
, ma si basa sul codice C sotto il cofano.