2012-12-04 10 views
7

İki anahtar içeren bir data.table var: Year (10 levels) ve MemberID (200,000 levels). Ben setkey, setkey(MemberID, Year) farklı performans ile setkey(Year, MemberID) karşılaştırmaktır? Eğer öyleyse, hangi yol daha iyi olacak?Data.table maddesindeki tuşların sırası mu?

cevap

8

Anahtar ayarının performansı ve hızı, anahtar değişken türlerine bağlı olacaktır. numeric sütunları integer'dan daha yavaş olacaktır. character sütunları (kısa dizeler olduğunda) hızlı görünüyor.

örn

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) 

Bazı zamanlamaları yolu daha iyi olacaktır hangi olarak

# 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 

. Bu muhtemelen büyük olasılıkla tek başınıza daha çok alt gruplara ayrıldığınıza bağlı olacaktır. Eğer o zaman

D[J(1)] 

kullanabilirsiniz year, id olarak anahtar kurduysanız ancak anahtar id, year olarak kurulmuştur

Örneğin, yılın 1.

tüm verilerini almak gerekebilir o zaman daha yazarak ve bu unique(id) hesaplamak zorundadır olarak uzun sürer hangi

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

gerekir.

İkincil bir anahtara izin veren bir özellik isteği var. FR#1007, ancak bu henüz uygulanmadı. Şu anda birden fazla sütunu işgal edebilecek tek bir anahtar var.

+0

Çok teşekkürler mnel. – AdamNYC

İlgili konular