खोज…


परिचय

Data.table की कुंजी और सूचकांकों में कुछ संगणनाओं को तेजी से चलाने की अनुमति मिलती है, जो ज्यादातर जुड़ने और कम होने से संबंधित होती हैं। कुंजी तालिका के वर्तमान सॉर्ट क्रम का वर्णन करती है; जबकि प्रत्येक सूचकांक स्तंभों के अनुक्रम के संबंध में तालिका के आदेश के बारे में जानकारी संग्रहीत करता है। विषय पर आधिकारिक विगनेट्स के लिंक के लिए नीचे "रिमार्क्स" अनुभाग देखें।

टिप्पणियों

आधिकारिक विगनेट्स इस विषय का सबसे अच्छा परिचय हैं:

कुंजी बनाम सूचकांक

स्तंभों के अनुक्रम के द्वारा डेटाटेबल को "की" किया जा सकता है, रुचि वाले कार्यों को बताते हुए कि डेटा उन स्तंभों द्वारा सॉर्ट किया जाता है। कुंजी प्राप्त या सेट करने के लिए, प्रलेखित फ़ंक्शंस का उपयोग करें ?key

इसी तरह, फ़ंक्शन डेटाटेबल के "सूचकांकों" का लाभ उठा सकते हैं। प्रत्येक सूचकांक - और एक तालिका में एक से अधिक हो सकते हैं - स्तंभों के अनुक्रम के संबंध में डेटा के क्रम के बारे में जानकारी संग्रहीत करता है। एक कुंजी की तरह, एक सूचकांक कुछ कार्यों को गति दे सकता है। प्राप्त करने के लिए या सेट सूचकांक, समारोहों में दस्तावेज का उपयोग ?indices

संकेत भी स्वचालित रूप से सेट किए जा सकते हैं (वर्तमान में केवल एक समय में एक कॉलम के लिए)। देखें ?datatable.optimize यह कैसे काम करता है और कैसे यदि आवश्यक हो तो उसे निष्क्रिय करने पर जानकारी के लिए।

सत्यापन और अद्यतन

कुंजी कॉलम में गुम मानों की अनुमति है।

कुंजी और सूचकांक को विशेषताओं के रूप में संग्रहीत किया जाता है और दुर्घटना से, तालिका में डेटा के वास्तविक क्रम के अनुरूप नहीं हो सकता है। कई फ़ंक्शन उपयोग करने से पहले कुंजी या इंडेक्स की वैधता की जांच करते हैं, लेकिन यह ध्यान में रखने योग्य है।

कुंजी और सूचकांक अपडेट के बाद हटा दिए जाते हैं जहां यह स्पष्ट नहीं है कि क्रम क्रम संरक्षित है। उदाहरण के लिए, DT = data.table(a=c(1,2,4), key="a") से शुरू होकर, यदि हम DT[2, a := 3] जैसे अपडेट करते हैं, तो कुंजी टूट जाती है।

सबसेट का चयन करने के लिए प्रदर्शन में सुधार

# example data
set.seed(1)
n  = 1e7
ng = 1e4
DT = data.table(
    g1  = sample(ng, n, replace=TRUE),
    g2  = sample(ng, n, replace=TRUE),
    v  = rnorm(n)
)

एक कॉलम पर मिलान

%in% == या %in% साथ सबसेट ऑपरेशन के पहले रन के बाद ...

system.time(
    DT[ g1 %in% 1:100]
)
#    user  system elapsed 
#    0.12    0.03    0.16 

g1 लिए एक इंडेक्स स्वचालित रूप से बनाया गया है। बाद के सबसिमेटिंग ऑपरेशन लगभग तुरंत चलते हैं:

system.time(
    DT[ g1 %in% 1:100]
)
#    user  system elapsed 
#       0       0       0

जब कोई इंडेक्स बनाया या उपयोग किया जाता है, तो मॉनिटर करने के लिए, verbose=TRUE विकल्प जोड़ें या ग्लोबल सेटिंग options(datatable.verbose=TRUE) बदलें।

कई कॉलम पर मिलान

वर्तमान में, दो कॉलमों का मिलान स्वचालित रूप से एक इंडेक्स नहीं बनाता है:

system.time(
    DT[ g1 %in% 1:100 & g2 %in% 1:100]
)
#    user  system elapsed 
#    0.57    0.00    0.57

इसे फिर से चलाएं और यह धीमा रहेगा। यहां तक कि अगर हम मैन्युअल रूप से setindex(DT, g1, g2) साथ सूचकांक जोड़ते हैं, तो यह धीमा रहेगा क्योंकि यह क्वेरी अभी तक पैकेज द्वारा अनुकूलित नहीं है।

सौभाग्य से, अगर हम उन मूल्यों के संयोजन की गणना कर सकते हैं जिन्हें हम खोजना चाहते हैं और एक सूचकांक उपलब्ध है, तो हम जल्दी से समान-जुड़ सकते हैं:

system.time(
    DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
#    user  system elapsed 
#    0.53    0.00    0.54 
setindex(DT, g1, g2)
system.time(
    DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
#    user  system elapsed 
#       0       0       0

CJ साथ, संयोजनों की संख्या के लिए बाहर देखना बहुत महत्वपूर्ण है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow