डाटा आईओ सुविधाओं मैं में से पहले मैं सीखने के लिए प्रतिबद्ध देखा में से एक था जा आर बेहतर या बदतर के लिए, यहाँ इन मुद्दों पर मेरी टिप्पणियों और समाधान/राहत दिला रहे हैं: आर हैंडल नहीं करता
1.कि बड़ा डेटा (> 2 जीबी?) मेरे लिए यह एक मिथ्या है। डिफ़ॉल्ट रूप से, सामान्य डेटा इनपुट फ़ंक्शंस आपके डेटा को रैम में लोड करता है। ग्लिब नहीं होना चाहिए, लेकिन मेरे लिए, यह एक सुविधा है जो एक बग नहीं है - कभी भी मेरा डेटा मेरी उपलब्ध रैम में फिट होगा, जहां मैं इसे चाहता हूं। इसी तरह, SQLite की सबसे लोकप्रिय सुविधाओं में से एक इन-मेमोरी विकल्प है - उपयोगकर्ता को पूरे डीबी को रैम में लोड करने का आसान विकल्प है। यदि आपका डेटा स्मृति में फिट नहीं होगा, तो आर सामान्य आरडीबीएमएस सिस्टम (आरओडीबीसी, आरएसक्लाइट, आरएमआईएसक्यूएल, इत्यादि) के कनेक्शन के माध्यम से, फ़ाइलशैश पैकेज जैसे नो-फ्रिल विकल्पों के माध्यम से, और इसके माध्यम से, इसे जारी रखने के लिए आश्चर्यजनक रूप से आसान बनाता है। सिस्टम जो वर्तमान तकनीक/प्रथाओं (उदाहरण के लिए, मैं ff की सिफारिश कर सकता हूं)। दूसरे शब्दों में, आर डेवलपर्स ने एक समझदार (और शायद इष्टतम) डिफ़ॉल्ट चुना है, जिससे इसे ऑप्ट आउट करना बहुत आसान है।
2. read.table (read.csv, read.delim, एट अल।) के प्रदर्शन, अनुसंधान में डेटा प्राप्त करने के लिए सबसे आम साधन, सुधार किया जा सकता 5x (और अक्सर बहुत मेरे अनुभव में और अधिक) केवल कुछ read.table के डिफ़ॉल्ट तर्कों को चुनकर - प्रदर्शन पर सबसे बड़ा प्रभाव वाले लोगों का उल्लेख आर की सहायता (? read.table) में किया गया है। संक्षेप में, आर डेवलपर्स हमें बताते हैं कि यदि आप पैरामीटर 'colClasses', 'nrows', 'sep', और 'comment.char' (विशेष रूप से, पास में '' के लिए मान प्रदान करते हैं, यदि आपको पता है कि आपकी फ़ाइल हेडर के साथ शुरू होती है या लाइन 1 पर डेटा), आप एक महत्वपूर्ण प्रदर्शन लाभ देखेंगे। मैंने पाया कि यह सच होना है।
यहाँ के टुकड़े मैं उन पैरामीटर के लिए उपयोग कर रहे हैं:
(अपनी डेटा फ़ाइल में पंक्तियों की संख्या प्राप्त करने के लिए पैरामीटर एक तर्क के रूप इस स्निपेट की आपूर्ति करने के लिए, 'nrows', अपने कॉल में read.table को):
as.numeric((gsub("[^0-9]+", "", system(paste("wc -l ", file_name, sep=""), intern=T))))
प्रत्येक स्तंभ के लिए कक्षाएं पाने के लिए:
function(fname){sapply(read.table(fname, header=T, nrows=5), class)}
ध्यान दें: आप एक तर्क के रूप में इस स्निपेट पारित नहीं हो सकता है, आप इसे पहले कॉल करने के लिए है, तो मूल्य प्रेषित गीला करना urned - दूसरे शब्दों में, फ़ंक्शन को कॉल करें, लौटाए गए मान को एक चर में बाध्य करें, और उसके बाद वैरिएबल में मान को अपने कॉल में पैरामीटर 'colClasses' को पढ़ने के लिए टाइप करें। योग्य:
3। स्कैन का उपयोग करना। केवल थोड़ी अधिक परेशानी के साथ, आप 'read.table' ('read.table' के बजाय 'स्कैन' का उपयोग करके उस से बेहतर कर सकते हैं ('read.table' को अनुकूलित करना) वास्तव में 'स्कैन' के आसपास एक रैपर है)। एक बार फिर, यह करना बहुत आसान है। मैं व्यक्तिगत रूप से प्रत्येक कॉलम इनपुट करने के लिए 'स्कैन' का उपयोग करता हूं, फिर आर, यानी, df = data.frame (cbind (col1, col2, ....) के अंदर अपना डेटा.फ्रेम बनाएं।
4. साधारण फ़ाइल स्वरूपों (उदा।, 'Txt', 'csv') के स्थान पर दृढ़ता के लिए आर के कंटेनर का उपयोग करें। आर की मूल डेटा फ़ाइल '।RData 'एक बाइनरी प्रारूप है जो संपीड़ित (' .gz ') txt डेटा फ़ाइल से थोड़ा छोटा है। आप (,) को सहेजते हुए उन्हें बनाते हैं। आप लोड() के साथ इसे आर नेमस्पेस में वापस लोड करते हैं। 'Read.table' की तुलना में लोड समय में अंतर नाटकीय है। उदाहरण के लिए, डब्ल्यू/एक 25 एमबी फ़ाइल (असंपीड़ित आकार)
system.time(read.table("tdata01.txt.gz", sep=","))
=> user system elapsed
6.173 0.245 **6.450**
system.time(load("tdata01.RData"))
=> user system elapsed
0.912 0.006 **0.912**
5. डेटा प्रकार पर ध्यान देना आप एक प्रदर्शन को बढ़ावा देने अक्सर देने के लिए और अपनी स्मृति पदचिह्न को कम कर सकते हैं। यह बिंदु शायद आर से डेटा प्राप्त करने में अधिक उपयोगी है। यहां ध्यान रखने के लिए महत्वपूर्ण बिंदु यह है कि डिफ़ॉल्ट रूप से, आर अभिव्यक्तियों में संख्या को डबल-परिशुद्धता फ़्लोटिंग पॉइंट के रूप में व्याख्या किया जाता है, उदाहरण के लिए,> टाइपोफ (5) रिटर्न "डबल। " प्रत्येक के उचित आकार के सरणी के ऑब्जेक्ट आकार की तुलना करें और आप महत्व देख सकते हैं (object.size() का उपयोग करें)। तो जब आप कर सकते हैं पूर्णांक करने के लिए मजबूर।
आखिरकार, 'लागू' परिवारों के कार्यों (दूसरों के बीच) "छुपे हुए लूप" या लूप रैपर नहीं हैं। वे सी में लागू लूप हैं - बड़े अंतर प्रदर्शन के अनुसार। [संपादित करें: एडब्ल्यूबी ने सही ढंग से बताया है कि 'sapply', 'tapply', और 'mapply' को सी में लागू किया गया है, 'लागू' बस एक रैपर फ़ंक्शन है।
आर प्रदर्शन पर हाल की जानकारी के लिए, हैडली विकम के एडवांस्ड आर में [प्रदर्शन] (http://adv-r.had.co.nz/Performance.html) पर एक सूचनात्मक अनुभाग है और जेफरी हॉर्नर ने कुछ अद्भुत लिखा [आर में हैश टेबल प्रदर्शन] पर पोस्ट (http://jeffreyhorner.tumblr.com/post/114524915928/hash-table-performance-in-r-part-i)। – cbare