2012-12-04 16 views
7

मेरे पास एक डेटा.table है जिसमें दो कुंजी हैं: वर्ष (10 स्तर) और सदस्य आईडी (200,000 स्तर)। जब मैं सेटकी करता हूं, setkey(MemberID, Year) परिणामस्वरूप विभिन्न प्रदर्शन setkey(Year, MemberID) के साथ तुलना करता है? यदि हां, तो कौन सा तरीका बेहतर होगा?डेटाटेबल मामले में चाबियों का क्रम क्या है?

उत्तर

8

कुंजी सेटिंग का प्रदर्शन और गति कुंजी परिवर्तनीय प्रकारों पर निर्भर करेगी। numeric कॉलम integer से धीमे हो जाएंगे। character कॉलम (जब छोटे तार) तेजी से दिखाई देते हैं।

जैसे

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) 

कुछ समय

# 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 

जो करने के लिए के रूप में जिस तरह से बेहतर होगा। यह संभवतः उस पर निर्भर करेगा जो आपको अधिक बार अकेले सब्सक्राइब करने की संभावना है।

उदाहरण के लिए, आप आप year, id के रूप में कुंजी निर्धारित किया है तो आप

D[J(1)] 

उपयोग कर सकते हैं, लेकिन कुंजी id, year के रूप में स्थापित किया गया था, तो अगर साल 1.

के लिए सभी डेटा प्राप्त करने के लिए आवश्यकता हो सकती है तो आप

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

की आवश्यकता होगी जो अधिक टाइपिंग है और के रूप में यह unique(id) गणना करने के लिए है लंबा समय लगेगा।

एक सुविधा अनुरोध FR#1007 है जो द्वितीयक कुंजी की अनुमति देता है, लेकिन यह अभी तक लागू नहीं किया गया है। वर्तमान में एक भी कुंजी है जो एक से अधिक कॉलम पर कब्जा कर सकती है।

+0

धन्यवाद बहुत, एमएलएल। – AdamNYC

संबंधित मुद्दे