2012-12-04 3 views
7

J'ai une data.table qui a deux clés: Année (10 niveaux) et MemberID (200 000 niveaux). Lorsque je mets la touche, est-ce que setkey(MemberID, Year) donne des performances différentes par rapport à setkey(Year, MemberID)? Si oui, quelle sera la meilleure façon?L'ordre des clés dans data.table est-il important?

Répondre

8

La performance et la vitesse du réglage de la touche dépendent des types de variables clés. numeric colonnes sera plus lent que integer. character colonnes (lorsque les chaînes courtes) semblent être rapide.

par exemple

library(data.table) 

set.seed(1) 
DIC <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DIC2 <- copy(DIC) 
DIF <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.factor(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DIF2 <- copy(DIF) 
DNC <- data.table(year = sample(as.numeric(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DNC2 <- copy(DNC) 
DCC <- data.table(year = sample(as.character(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DCC2 <- copy(DCC) 
DII <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(seq_len(2e5), 5e6, TRUE), z = rnorm(5e6)) 
DII2 <- copy(DII) 

Quelques timings

# key of integer, character columns 
system.time(setkey(DIC, year ,id)) 
    user system elapsed 
    3.21 0.11 3.31 
system.time(setkey(DIC2, id, year)) 
    user system elapsed 
    3.43 0.03 3.45 
# key of integer factor columns 
system.time(setkey(DIF, year ,id)) 
    user system elapsed 
    6.31 0.05 6.37 
system.time(setkey(DIF2, id, year)) 
    user system elapsed 
    6.44 0.06 6.54 
# key of numeric, character columns 
system.time(setkey(DNC, year ,id)) 
    user system elapsed 
    9.91 0.07 10.29 
system.time(setkey(DNC2, id, year)) 
    user system elapsed 
    10.11 0.07 10.34 
# key of two character columns 
system.time(setkey(DCC, year ,id)) 
    user system elapsed 
    3.34 0.05 3.40 
system.time(setkey(DCC2, id, year)) 
    user system elapsed 
    3.40 0.02 3.42 
# key of two integer columns 
system.time(setkey(DII, year ,id)) 
    user system elapsed 
    6.25 0.02 6.53 
system.time(setkey(DII2, id,year)) 
    user system elapsed 
    6.44 0.05 6.64 

Quant à quelle manière sera mieux. Cela dépendra probablement de ce que vous êtes le plus susceptible de sous-estimer plus souvent seul.

Par exemple, vous devrez peut-être obtenir toutes les données pour l'année 1.

Si vous avez défini la clé comme year, id vous pouvez utiliser

D[J(1)] 

mais si la clé a été définie comme id, year alors vous avez besoin

D[J(unique(id),1), nomatch = 0] 

qui est plus dactylographie et prendra plus de temps car il doit calculer unique(id).

Il existe une demande de fonctionnalité FR#1007 qui cherche à autoriser une clé secondaire, mais elle n'est pas encore implémentée. Actuellement, il existe une seule clé qui peut occuper plus d'une colonne.

+0

Merci beaucoup, mnel. – AdamNYC

Questions connexes