आर में कम्प्यूटेशन गति?


16

मुझे एसएएस से बाहर एक वर्तमान बड़े स्टोचस्टिक मॉडल में से एक और एक नई भाषा में स्थानांतरित करने का काम सौंपा गया है। व्यक्तिगत रूप से, मैं एक पारंपरिक संकलित भाषा पसंद करता हूं, लेकिन पीआई चाहता है कि मैं आर की जांच करूं, जिसका मैंने कभी उपयोग नहीं किया है। एसएएस से मॉडल प्राप्त करने के लिए हमारी प्रेरणा (1) कई लोगों के पास इसका उपयोग नहीं है क्योंकि एसएएस महंगा है, (2) हम एक व्याख्या की गई भाषा से दूर जाना चाहते हैं, और (3) एसएएस के लिए धीमा है हमारे पास जिस प्रकार का मॉडल है।

(1) के लिए, स्पष्ट रूप से आर इसके मुक्त होने की आवश्यकता को संतुष्ट करता है। (2) के लिए, आदर्श रूप से, हम एक निष्पादन योग्य बनाना चाहते हैं, लेकिन आर आमतौर पर एक स्क्रिप्टेड भाषा के रूप में उपयोग किया जाता है। मुझे लगता है कि किसी ने हाल ही में एक आर कंपाइलर को बाहर रखा है - क्या यह अच्छी तरह से प्राप्त किया गया है? क्या यह प्रयोग करने में आसान है? हम बल्कि उपयोगकर्ता को R डाउनलोड करने के लिए बाध्य नहीं करेंगे। (3) के लिए, एसएएस के साथ हमारी समस्या हर समय आई / ओ लिखने और डेटा सेट पढ़ने में खर्च होती है। हमारा मॉडल कम्प्यूटेशनल रूप से गहन है, और हम अक्सर रनटाइम द्वारा सीमित होते हैं। (उदा। किसी के लिए सप्ताहांत में लोगों के कंप्यूटरों को चलाना प्रदर्शन करना असामान्य नहीं है।) हमारे पास फोरट्रान में बनाया गया एक समान मॉडल है जिसमें समान समस्या नहीं है क्योंकि सभी काम स्मृति में किए जाते हैं। R कैसे काम करता है? क्या यह एसएएस के समान होगा, जिसमें यह डेटास्टेप्स में काम करता है, फाइलें पढ़ना और लिखना? या यह स्मृति में सरणी हेरफेर कर सकता है?


आप आमतौर पर अपने सभी काम एक ही डेटा चरण में करके sas को गति दे सकते हैं। इससे मुझे I / O समय कम करना चाहिए, क्योंकि आप प्रभावी रूप से केवल एक बार डेटा पढ़ रहे हैं। बहुत सारी प्रक्रियाओं का उपयोग करना भी आपको धीमा कर देगा। उदाहरण के लिए, यदि आप बार-बार कॉल करते हैं, तो glm या proc logistic कहते हैं (बूटस्ट्रैप के लिए कहें), यह बहुत बड़ा डेटा सेट बनाने के लिए तेज़ है और कई खरीद कॉल आह्वान करने के बजाए बाय बाय स्टेटमेंट का उपयोग करता है (जैसे मैक्रो% डू लूप का उपयोग करके)। यदि आप अच्छी तरह से प्रोग्राम करते हैं, तो आपको फ़ाइलों को पढ़ने और आउटपुट करने के कारण समय की समस्याएं नहीं होनी चाहिए (कम से कम अब अन्य सॉफ़्टवेयर की तुलना में नहीं
संभावना

इसके अतिरिक्त आप sas डेटा स्टेप्स में अस्थायी सरणियों का उपयोग इसी तरह से कर सकते हैं कि कैसे आप R में मैट्रिसेस का उपयोग करेंगे।
संभावना 14

जवाबों:


18

मेमोरी में R काम करता है - इसलिए आपके डेटा को अधिकांश कार्यों के लिए मेमोरी में फिट होने की आवश्यकता होती है।

कंपाइलर पैकेज, अगर मैं उस चीज के बारे में सोच रहा हूं जो आप सोच रहे हैं (ल्यूक टियरनी के कंपाइलर पैकेज आर के साथ आपूर्ति की गई है), पारंपरिक अर्थों (सी, फोरट्रान) में संकलित भाषा के समान नहीं है। यह जावा वीटेक द्वारा निष्पादित जावा बाइटकोड के अर्थ में आर के लिए एक बाइट कंपाइलर है या एमएसीएस एलआईएसपी कोड का बाइट संकलन है। यह आर कोड को मशीन कोड में संकलित नहीं करता है, बल्कि आर कोड को बायटेकोड में तैयार करता है, इसलिए इसका उपयोग कच्चे आर कोड की तुलना में अधिक कुशलता से किया जा सकता है।

ध्यान दें कि यदि आपने अच्छी तरह से फोरट्रान का गठन किया है, तो आप शायद दोनों दुनिया के सर्वश्रेष्ठ हो सकते हैं; आर संकलित फोरट्रान दिनचर्या कह सकते हैं।


धन्यवाद! यह जानना अच्छा है कि मैं महान आर ग्राफिक्स और कॉल फ़ॉरट्रान रूटीन संकलित कर सकता हूं। इसका जवाब हो सकता है!
मेलिसा

2
बस स्मृति के बारे में गेविन के नोट पर विस्तार करने के लिए: इस क्रैन कार्य दृश्य में बड़े मेमोरी पर अनुभाग यदि आप बड़े डेटा सेट के साथ काम कर रहे हैं देखें: cran.r-project.org/web/views/HighPerformanceComputing.html
ब्रैंडन Bertelsen

1
यह भी सोचें कि यह ध्यान रखना महत्वपूर्ण है कि प्रदर्शन में वृद्धिशील लाभ हासिल करने के लिए Rcpp का उपयोग किया जा सकता है।
ब्रैंडन बर्टेलसेन

Rcpp C ++ को R / के साथ उपयोग के लिए लपेटने के लिए उपयोगी है। यह प्रक्रिया (बेहद) को एड्स करता है लेकिन फिर भी संकलित कोड को कॉल करने के लिए R के मूल टूल का उपयोग कर रहा है। यदि ओपी में पहले से ही फोरट्रान कोड या फोरट्रान कौशल हैं, तो आरसीपीपी कम उपयोग का हो सकता है।
मोनिका को बहाल करें - जी सिम्पसन

13

मैंने SAS15 वर्षों के लिए उपयोग किया है , और Rपिछले 6 महीनों में गंभीरता से उपयोग करना शुरू कर दिया है , कुछ वर्षों के आसपास इसमें कुछ छेड़छाड़ की है। एक प्रोग्रामिंग दृष्टिकोण से, R सीधे डेटा जोड़तोड़ करता है, DATAया PROC SQLप्रक्रियाओं के बराबर नहीं है क्योंकि उन्हें ज़रूरत नहीं है (बाद में अधिक कुशल होने पर SASजब बाहरी डेटा स्रोतों से बहुत अधिक डेटा हेरफेर होता है, जैसे प्रशासनिक डेटा)। इसका मतलब यह है कि, अब मैं इसे लटका रहा हूं, डेटा हेरफेर में तेजी है Rऔर इसके लिए बहुत कम कोड की आवश्यकता है।

मुख्य मुद्दा जो मुझे मिला है वह है मेमोरी। सभी आर संकुल WEIGHTप्रकार विनिर्देशन की अनुमति नहीं देते हैं , इसलिए यदि आपके पास या विवरणों SASमें प्रयुक्त चर वाले डेटासेट हैं , तो आपके पास समस्याएँ हो सकती हैं। मैंने आर में और पैकेजों को देखा है, लेकिन वे सभी आर पैकेजों के साथ संगत नहीं दिखाई देते हैं, इसलिए यदि आपके पास बहुत बड़े डेटासेट हैं जिन्हें विश्लेषण की आवश्यकता है जो अपेक्षाकृत असामान्य हैं, और एकत्र किए गए हैं, तो आपके पास स्मृति के साथ समस्या हो सकती है।FREQREPLICATEffbigmemory

स्वचालन के लिए, यदि आपके पास है SAS macrosतो आपको समकक्ष को प्रोग्राम करने Rऔर बैच के रूप में चलाने में सक्षम होना चाहिए ।

में कोडिंग के लिए R, मैं Notepad++भाषा का उपयोग और सेट कर रहा था R, और अब मैं खुश हूँ R Studio। ये दोनों उत्पाद स्वतंत्र हैं, और भाषा को बेहतर SASसिंटैक्स GUI की तरह चिह्नित करते हैं (मैंने केवल सिंटैक्स स्क्रीन का उपयोग किया है SAS)।

लोगों से अदला-बदली करने के लिए एक वेबसाइट और संबंधित पुस्तक SASहै R। मैंने उन्हें कुछ SASआदेशों का अनुवाद करने के तरीके के बारे में जानने के लिए उपयोगी पाया R

अद्यतन: एक बात है कि मुझे पागल कर दिया जब के लिए आ रहा Rहै कि है R, स्वीकार नही करता सब कुछ एक डेटा सेट (है data frameमें Rभाषा), क्योंकि यह रास्ते में एक सांख्यिकीय पैकेज नहीं है SAS, SPSS, Stata, आदि कर रहे हैं। इसलिए, उदाहरण के लिए, मुझे ifकाम करने में थोड़ा समय लगा क्योंकि मुझे ifवैक्टर (या शायद मैट्रिसेस) के साथ बयानों के लिए मदद मिलती रही, जबकि मुझे ऐसे ifबयान की जरूरत थी, जिसके साथ काम किया हो data frames। इसलिए मदद के पन्नों को शायद आपको सामान्य रूप से अधिक बारीकी से पढ़ने की आवश्यकता है, क्योंकि आपको यह जांचना होगा कि आप जो कमांड करना चाहते हैं वह आपके पास मौजूद डेटा ऑब्जेक्ट प्रकार के साथ काम करेगा।

वह बिट जो अभी भी मुझे एक नया Rकमांड सीखते समय पागल करता है (जैसे एक योगदान पैकेज में विश्लेषण विधि) यह है कि कमांड के लिए सहायता अक्सर पूरी तरह से आत्म-निहित नहीं होती है। मैं कमांड पेज सीखने की कोशिश करने के लिए हेल्प पेज पर जाऊंगा और उपयोग के नोट्स अक्सर उनमें ...निहित होते हैं। कभी-कभी यह पता लगाने की कोशिश करना कि ...मुझे क्या करना चाहिए या कहाँ जाना चाहिए, मुझे एक पुनरावर्ती पाश में ले गया। सहायता नोटों की सापेक्ष संक्षिप्तता, SASजिसमें से आने वाले वाक्य रचना के विस्तृत उदाहरण और काम किए गए उदाहरण उदाहरण में अध्ययन की व्याख्या के साथ काम करते हैं, को एक बड़ा झटका लगा।


2
+1 कृपया हमारे मेटा थ्रेड को अपडेट करने पर विचार करें जहां हमने आँकड़े सॉफ़्टवेयर संसाधनों के लिंक एकत्र किए हैं। वहाँ एक उत्तर आर के लिए और दूसरा SAS के लिए है: दोनों r4stats.com के लिए एक लिंक होने से लाभ होगा। (यह धागा वास्तव में हमारे सामान्य प्रश्न का एक हिस्सा है हम इसे वर्तमान और उपयोगी रखने की उम्मीद है।।)
whuber

1
R के पास RODBC ड्राइवर या SQLite के माध्यम से SQL एक्सेस का समर्थन करने वाले पैकेज भी हैं।
डीडिन

1
मैं R मदद के बारे में आपकी टिप्पणियों से सहमत हूं। मैंने वास्तव में अनिवार्य रूप से इंगित किया था कि आप कई वर्षों पहले आर मेलिंग सूची में से एक पर क्या कह रहे हैं। प्रतिक्रिया सकारात्मक नहीं थी। निष्पक्षता में, मैं (ए) ने शायद खुद को बहुत अच्छी तरह से व्यक्त नहीं किया, और कोई ठोस उदाहरण नहीं दिया और (बी) ने मामले का पीछा नहीं किया। संक्षेप में, समस्या 1 उदाहरण बहुत जटिल है और कई असंबंधित अवधारणाओं को शामिल करता है। जटिल उदाहरण ठीक हैं, लेकिन सरल उदाहरणों का पालन करना चाहिए। समस्या 2 यह है कि लगभग कोई भी एनोटेशन या स्पष्टीकरण नहीं है कि उदाहरण क्या करते हैं।
फहीम मीठा

आर "मदद" के बारे में मेरे बॉस ने मुझसे कही गई बात की याद दिलाई। "आप आर को किसी ऐसे व्यक्ति के साथ करने से सीखते हैं जो पहले से ही जानता है कि आर आपके बगल में कंप्यूटर पर बैठा है"
संभावना 16

और बाकी सभी के लिए किताबें और स्टैक ओवरफ्लो हैं। हां, अपने आप से आर सीखना बहुत कठिन है, कम से कम यह मेरे लिए है।
मिशेल

10

R एक प्रोग्रामिंग लैंग्वेज है। यह काम नहीं करता है। यह जो कुछ भी आप इसे करना चाहते हैं वह करता है, क्योंकि यह एक प्रोग्रामिंग भाषा है, आपकी इच्छाओं के लिए एक दास, घुंघराले कोष्ठक और कॉलन की भाषा में व्यक्त किया गया है।

इसे फोरट्रान या सी की तरह सोचें, लेकिन अंतर्निहित सदिशीकरण के साथ, ताकि आपको सरणियों पर लूप न करना पड़े, और डायनेमिक मेमोरी प्रबंधन ताकि आपको किसी भी समय मॉलॉक () या ऐरे आकार की घोषणा न करनी पड़े।

यह ज्यादातर अपना सारा काम स्मृति में करता है, लेकिन अगर आप किसी फाइल के हिस्से को पढ़ना चाहते हैं, उसे मंगाते हैं, तो कुछ परिणामों को थूक दें, और अगले बिट में पढ़ें, ठीक है, आप आगे बढ़ते हैं और एक आर प्रोग्राम लिखते हैं, क्या वो।

आप अपने आप को यह कहते हुए प्रतिवाद करते हैं कि मॉडल कम्प्यूटेशनल रूप से गहन है लेकिन एसएएस आई / ओ के कारण धीमा है ... एक या दूसरे निश्चित रूप से ...

यदि आपको पहले से ही फोरट्रान में कुछ समान मिला है, और आप कहते हैं कि आप एक व्याख्या की गई भाषा से दूर जाना चाहते हैं, तो क्यों न केवल फोरट्रान में भी ऐसा करें?

आर कंपाइलर कुछ स्पीडअप का कारण बन सकता है, लेकिन अगर आपका आर कोड अच्छी तरह से लिखा गया है, तो आपको कुछ भी भारी नहीं मिलेगा - सी या फोरट्रान में लिखना पसंद नहीं है।


आह, मैंने खुद को अच्छी तरह से नहीं समझाया। यह डेटासेट के अपने हेरफेर में गहन है, जो एसएएस में, I / O में बहुत अधिक समय बिताने का मतलब है। मेरा प्रारंभिक सुझाव फोरट्रान था, लेकिन पीआई हमें आर में स्विच करने में रुचि रखता है, इसलिए वह चाहता था कि मैं इसकी जांच करूं। धन्यवाद!
मेलिसा

7

मैं समझता हूं कि डिफ़ॉल्ट रूप से एसएएस उन मॉडलों के साथ काम कर सकता है जो मेमोरी से बड़े हैं, लेकिन यह आर के साथ ऐसा नहीं है, जब तक कि आप विशेष रूप से बिगलैम या एफएफ जैसे पैकेज का उपयोग नहीं करते हैं।

हालाँकि, यदि आप R में सरणी वर्क कर रहे हैं, तो इसे बहुत जल्दी किया जा सकता है - हो सकता है कि कुछ मामलों में C प्रोग्राम की आधी गति हो, लेकिन यदि आप कुछ ऐसा कर रहे हैं, जिसे वेक्टराइज़ नहीं किया जा सकता है, तो यह काफी अच्छा लगेगा धीमी गति से। आपको एक उदाहरण देने के लिए:

# create a data.frame with 4 columns of standard normally distributed RVs
N <- 10000

# test 1
system.time( {df1 <- data.frame(h1=rnorm(N),
                h2=rpois(N, lambda=5),
                h3=runif(N),
                h4=rexp(N))
} )
# about 0.003 seconds elapsed time

# vectorised sum of columns 1 to 4
# i.e. it can work on an entire column all at once
# test 2
system.time( { df1$rowtotal1 <- df1$h1 + df1$h2 + df1$h3 + df1$h4 })
# about 0.001 seconds elapsed time

# test 3
# another version of the vectorised sum
system.time( { df1$rowtotal2 <- rowSums(df1[,c(1:4)]) })
# about 0.001 seconds elapsed time

# test 4
# using a loop... THIS IS *VERY* SLOW AND GENERALLY A BAD IDEA!!! :-)
system.time( {
        for(i in 1:nrow(df1)) {
                df1$rowtotal3 <- df1[i,1]+ df1[i,2] + df1[i,3] + df1[i,4]
        }
} )
# about 9.2 seconds elapsed time

जब मैंने एन को दस से 100,000 के कारक तक बढ़ाया, तो मैंने 20 मिनट के बाद टेस्ट 4 पर छोड़ दिया, लेकिन परीक्षण 1: 3 में 61, 3 और 37 मिली- सेकंड लिया

एन = 10,000,000 के लिए परीक्षण 1: 3 के लिए समय 3.3, 0.6 और 1.6 हैं

ध्यान दें कि यह एक i7 लैपटॉप पर किया गया था और एन = 10million के लिए 480mb पर, मेमोरी एक मुद्दा नहीं था।

32-बिट विंडो पर उपयोगकर्ताओं के लिए R के लिए 1.5 जीबी मेमोरी की सीमा है चाहे आपके पास कितनी भी मेमोरी हो, लेकिन 64-बिट विंडो या 64-बिट लिनक्स के लिए ऐसी कोई सीमा नहीं है। इन दिनों स्मृति मेरे समय के एक घंटे की लागत की तुलना में बहुत सस्ती है, इसलिए मैं बस इसके आसपास जाने की कोशिश करने के बजाय समय बिताने के बजाय अधिक स्मृति खरीदता हूं। लेकिन यह मानता है कि आपका मॉडल स्मृति में फिट होगा।


1
(+1) उपयोगी चित्र प्रस्तुत करने के लिए धन्यवाद, सीन!
whuber

3

(2), आदर्श रूप से, हम एक निष्पादन योग्य बनाना चाहते हैं, लेकिन आमतौर पर आर एक स्क्रिप्टेड भाषा के रूप में उपयोग किया जाता है

हां, और यह R के लिए एक अच्छा कारण है। R पैकेज लिखने का शौक उपयोगकर्ताओं को आर द्वारा प्रदान किए गए अन्य उपकरणों के साथ आसानी से बातचीत करने की अनुमति देना है, जैसे कि बूटस्ट्रैप किए गए डेटा को फीड करना ... या जो भी वे चाहते हैं। अगर आपको नहीं लगता कि यह महत्वपूर्ण है, तो C / C ++ या अपनी पसंदीदा संकलित भाषा से चिपके रहें।

O()rle()

इसलिए बहुत सावधान रहें। अपने पहले प्रयासों के बाद, आपको निश्चित रूप से आर के साथ घृणा होगी, क्योंकि आप इसे धीमी गति से पाएंगे, एक अजीब वाक्यविन्यास के साथ, आदि। एक बार जब आप इसे जानते हैं, तो यह एक बहुत ही कुशल उपकरण हो सकता है। आप R / C / C ++ कोडिंग के लिए प्रारंभिक चरण के रूप में R में अपने तरीकों को स्क्रिप्ट करके भी समाप्त कर सकते हैं। अंतिम चरण R के API को पहले से तैयार किए गए कार्यों को सीखने के लिए होगा, और आप एक R विज़ार्ड होंगे :)


2

मेमोरी में ऐरे हेरफेर जाहिरा तौर पर एसएएस के लिए एक बड़ी बात है। मैं R से संबंधित बारीकियों को नहीं जानता, लेकिन मुझे लगता है कि R स्मृति में डिफ़ॉल्ट रूप से काम करता है, क्योंकि R, ff और bigmemory के लिए मेमोरी एक्सपैंशन पैकेज, मेमोरी से डिस्क पर डेटा ले जाते हैं। यदि आपके पास गति या स्मृति उपयोग में सुधार करना चाहते हैं तो मेरे पास आपके लिए संकेत हैं। गति में सुधार करने के लिए, आपको पहले आर का उपयोग करने की आवश्यकता है, अर्थात्: अपने कोड को वेक्टर करें और बाइट कोड संकलन का उपयोग करें। (इसके अलावा जितना संभव हो मेमोरी-कॉपी ऑपरेशन से बचें।) दूसरा, अपने कोड में धीमी गति से पैच की पहचान करने के लिए दिए गए कोड प्रोफाइलर Rprof () का उपयोग करें, और यदि आवश्यक हो तो उन्हें C या C ++ में फिर से लिखें। यदि आपको अधिक मेमोरी की आवश्यकता है, तो आप अपने डेटा को एक बार में पढ़ने के लिए read.table () फ़ंक्शन में स्किप तर्क का उपयोग कर सकते हैं और आप RMySQL जैसे पैकेज का भी उपयोग कर सकते हैं, जो डेटाबेस जोड़तोड़ उपयोगिताओं को आर। यदि आपको अभी भी अधिक मेमोरी की आवश्यकता है और गति में कमी को बर्दाश्त कर सकता है, तो आप R को समानांतर में चलाने के लिए स्नो पैकेज का उपयोग कर सकते हैं। (पिछले साल के अंत में प्रकाशित नॉर्मन मैटलॉफ़ की पुस्तक "द आर्ट ऑफ़ आर प्रोग्रामिंग" में आप इस बारे में और भी बहुत कुछ जान सकते हैं। यहाँ वर्णित पैकेजों के बारे में विवरण ऑनलाइन पाया जा सकता है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.