ऐसा लगता है कि वेस data.table
में ज्ञात समस्या का पता लगा सकता है जब अद्वितीय तारों की संख्या (स्तर) बड़ी है: 10,000।
Rprof()
कॉल sortedmatch(levels(i[[lc]]), levels(x[[rc]])
पर कॉल किए गए अधिकांश समय का खुलासा करता है? यह वास्तव में स्वयं शामिल नहीं है (एल्गोरिदम), लेकिन एक प्रारंभिक कदम है।
हाल के प्रयास कुंजी में वर्ण कॉलम की अनुमति देने में चले गए हैं, जो आर की अपनी वैश्विक स्ट्रिंग हैश तालिका के साथ अधिक बारीकी से एकीकृत करके उस समस्या को हल करना चाहिए। कुछ बेंचमार्क परिणामों को पहले से ही test.data.table()
द्वारा रिपोर्ट किया गया है, लेकिन स्तर को स्तर के स्तर तक बदलने के लिए अभी तक यह कोड नहीं लगाया गया है।
क्या नियमित पूर्णांक कॉलम के लिए data.table
से पांडा तेजी से विलीन हो जाते हैं? यह एल्गोरिदम स्वयं बनाम कारक मुद्दों को अलग करने का एक तरीका होना चाहिए।
इसके अलावा, data.table
समय श्रृंखला दिमाग में विलय हो गई है। इसके दो पहलू: i) बहु कॉलम आदेश दिया गया कुंजी (आईडी, डेटाटाइम) ii) तेजी से प्रचलित शामिल (roll=TRUE
) a.k.a. अंतिम अवलोकन आगे बढ़ाया गया।
मुझे पुष्टि करने के लिए कुछ समय चाहिए क्योंकि यह पहली बार मैंने देखा है कि data.table
की तुलना में मैंने देखा है।data.table v1.8.0 से
अद्यतन जुलाई 2012
- आंतरिक समारोह sortedmatch() हटा दिया और जब मैं प्रकार के स्तंभों के लिए एक्स स्तर तक के स्तर से मेल खाते chmatch() के साथ प्रतिस्थापित जारी किया 'कारक'। यह प्रारंभिक चरण एक (ज्ञात) महत्वपूर्ण मंदी पैदा कर रहा था जब कारक कॉलम के स्तर की संख्या बड़ी थी (उदा।> 10,000)। में ऐसे चार स्तंभों में शामिल होने के परीक्षण, जैसा कि वेस मैककिनी (पायथन पैकेज पांडस के लेखक) द्वारा दिखाया गया है। 0 मिलियन तारों का मिलान करना जिसमें से जिनमें से 600,000 अद्वितीय हैं, अब 16 से 0.5 तक कम हो गए हैं, उदाहरण के लिए।
कि रिलीज में
भी था:
चरित्र कॉलम अब चाबियाँ में अनुमति दी जाती है और कारक करने के लिए पसंद कर रहे हैं। data.table() और setkey() अब कारक पर कॉरर्स वर्ण नहीं है। कारक अभी भी समर्थित हैं। कार्यान्वयन FR # 1493, FR # 1224 और (आंशिक रूप से) FR # 951।
नए फ़ंक्शन chmatch() और% chin%, मिलान के तेज़ संस्करण() और वर्ण वैक्टर के लिए% में%। आर का आंतरिक स्ट्रिंग कैश उपयोग किया गया है (कोई हैश तालिका नहीं बनाई गई है)। उदाहरण के लिए वे chmatch में उदाहरण() से 4 गुना तेजी से हैं।
सितंबर 2013 तक डेटाटेबल सीआरएएन पर v1.8.10 है और हम v1.9.0 पर काम कर रहे हैं। NEWS लाइव अपडेट किया गया है।
लेकिन जैसा कि मैंने मूल रूप से लिखा था, इसके बाद के संस्करण:
data.table
है समय श्रृंखला को ध्यान में मर्ज करें। इसके दो पहलू: i) बहु कॉलम आदेश दिया गया कुंजी (आईडी, डेटाटाइम) ii) तेजी से प्रचलित जुड़ें (roll=TRUE
) a.k.a. अंतिम अवलोकन आगे बढ़ाया गया।
तो पांडा सम दो चरित्र स्तंभों की शामिल होने शायद अभी भी तेजी से data.table से है। चूंकि ऐसा लगता है जैसे यह संयुक्त दो कॉलम हैश करता है। data.table में कुंजी नहीं है क्योंकि यह प्रचलित आदेश में दिमाग में शामिल हो गया है। डेटाटेबल में एक "कुंजी" सचमुच सिर्फ क्रमबद्ध क्रम है (एसक्यूएल में क्लस्टर्ड इंडेक्स के समान; यानी, रैम में डेटा का ऑर्डर कैसे किया जाता है)। सूची में, माध्यमिक कुंजी जोड़ने के लिए है, उदाहरण के लिए।
संक्षेप में, 10,000 से अधिक अद्वितीय तारों के साथ इस विशेष दो-वर्ण-कॉलम परीक्षण द्वारा प्रकाश डाला गया चमकदार गति अंतर अब उतना बुरा नहीं होना चाहिए, क्योंकि ज्ञात समस्या ठीक हो गई है।
मेरी परिकल्पना: क्योंकि data.table डेटा.फ्रेम और डेटा.फ्रेम पर आधारित है धीमा है। और मुझे लगता है कि अधिकांश पांडा मर्ज कोड साइथन में है। –
@ जोशुआउलिच: आईआईआरसी 'data.table' सिर्फ 'data.frame' से विरासत में मिलता है, लेकिन यह हुड के नीचे सी-कोड पर निर्भर करता है। – digEmAll
@digEmAll: डेटा.फ्रेम धीमे होते हैं भले ही आप उन्हें सी में हेरफेर करते हैं, लेकिन मैंने डेटा.table स्रोत को कभी नहीं देखा है। –