2017-04-20 15 views
5

मुझे सैद्धांतिक उत्तर की आवश्यकता है।एसएएस, प्रो सारांश में कौन से आंकड़ों की गणना तेजी से की जाती है?

कल्पना कीजिए कि आपके पास 1.5 बिलियन पंक्तियों वाली तालिका है (तालिका को डीबी 2-ब्लू के साथ कॉलम-आधारित के रूप में बनाया गया है)।

आप एसएएस का उपयोग कर रहे हैं और आप Proc Summary का उपयोग करके न्यूनतम/अधिकतम/औसत मान, मानक विचलन मूल्य और प्रतिशत -10, प्रतिशत -90 अपने सहकर्मी समूहों के माध्यम से कुछ आंकड़े करेंगे।

उदाहरण के लिए, आपके पास 30,000 सहकर्मी समूह हैं और आपके पास प्रत्येक सहकर्मी समूह (कुल 1.5 अरब मूल्य) में 50,000 मूल्य हैं।

अन्य मामले में आपके पास 3 मिलियन सहकर्मी समूह हैं और आपके पास प्रत्येक सहकर्मी समूह में 50 मान हैं। तो आपके पास फिर से 1.5 अरब मूल्य हैं।

यदि आपके पास कम सहकर्मी समूह हैं लेकिन प्रत्येक सहकर्मी समूह में अधिक मूल्य हैं तो यह तेज़ी से बढ़ेगा? या यह अधिक सहकर्मी समूहों के साथ तेजी से चलेगा लेकिन प्रत्येक सहकर्मी समूह में कम कम मूल्य होगा।

मैं पहले मामले (30,000 सहकर्मी समूह और प्रति पीयर समूह के 50,000 मूल्य) का परीक्षण कर सकता था और इसमें लगभग 16 मिनट लग गए। लेकिन मैं दूसरे मामले के लिए परीक्षण नहीं कर सकता।

क्या आप रन-टाइम के लिए अनुमानित प्रोनोज़ लिख सकते हैं यदि मेरे पास 3 मिलियन पीयर-समूह हैं और प्रत्येक सहकर्मी समूह में 50 मान भी हैं?

प्रश्न के लिए एक और आयाम। यदि मैं Proc SQL का उपयोग करता हूं तो क्या उन आंकड़ों को करने में तेज़ी होगी?

उदाहरण कोड के नीचे है:

proc summary data = table_blu missing chartype; 
    class var1 var2; /* Var1 and var2 are toghether peer-group */ 
    var values; 

    output out = stattable(rename = (_type_ = type) drop = _freq_) 
    n=n min=min max=max mean=mean std=std q1=q1 q3=q3 p10=p10 p90=p90 p95=p95 
; 
run; 
+0

डेटा प्रति समूह के अनुसार क्रमबद्ध या प्रति समूह पर एक सूचकांक है है? क्या आप 'क्लास' या 'BY' कथन का उपयोग कर रहे हैं? – DomPazz

+0

@DomPazz हमारे सिस्टम प्रशासक ने कहा कि डीबी 2-ब्लू (कॉलम-आधारित) में अनुक्रमण के लिए कोई आवश्यकता नहीं है, इसके पास कुछ प्रकार का स्मार्ट समाधान है। यह वास्तव में अनुक्रमित पंक्ति-आधारित तालिका की तुलना में दोगुनी तेजी से perfomed। – user3714330

+0

@DomPazz मैं 'प्रो सारांश' में 'कक्षा' का उपयोग कर रहा हूं – user3714330

उत्तर

4

तो वहाँ चीज़ें यहाँ के बारे में सोचने के लिए कई हैं।

पहला बिंदु और प्रदर्शन के संदर्भ में संभवतः सबसे बड़ा डीबी 2 से एसएएस में डेटा प्राप्त कर रहा है। (मुझे लगता है कि यह एसएएस के डेटाबेस उदाहरण में नहीं है - अगर यह है तो मुझे सही करें)। यह एक बड़ी मेज है और इसे तार में ले जाने में समय लगता है। इसके कारण, यदि आप एसक्यूएल कथन के साथ डीबी 2 के अंदर इन सभी आंकड़ों की गणना कर सकते हैं, तो शायद यह आपका सबसे तेज़ विकल्प होगा।

तो यह सोचते हैं आप एसएएस सर्वर से डाउनलोड किया है तालिका:

CLASS चर के अनुसार क्रमबद्ध एक तालिका ज्यादा तेजी से एक अवर्गीकृत तालिका से कार्रवाई करने के लिए किया जाएगा। यदि एसएएस जानता है कि तालिका को सॉर्ट किया गया है, तो समूह में जाने के लिए रिकॉर्ड्स के लिए तालिका को स्कैन करने की आवश्यकता नहीं है, यह यादृच्छिक आईओ के बजाय ब्लॉक पढ़ सकता है।

यदि तालिका क्रमबद्ध नहीं है, तो समूह की संख्या जितनी अधिक होगी, तब अधिक तालिका स्कैन होनी चाहिए।

बिंदु यह है कि एचडी से सीपीयू तक डेटा प्राप्त करने की गति एक अनुरक्षित प्रक्रिया में सर्वोपरि होगी।

वहां से, आप एक मेमोरी और सीपीयू मुद्दे में आते हैं। प्रोक सारांश बहुप्रचारित है और एसएएस एक समय में एन समूह पढ़ेगा। यदि समूह का आकार उस धागे के लिए आवंटित स्मृति में फिट हो सकता है, तो आपको कोई समस्या नहीं होगी। यदि समूह का आकार बहुत बड़ा है, तो एसएएस को पेज करना होगा।

%let grps=3000; 
%let pergrp=5000; 

अवर्गीकृत:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 3001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   20.88 seconds 
     cpu time   31.71 seconds 

छाँटे गए:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 3001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   5.44 seconds 
     cpu time   11.26 seconds 

==========

मैं एक 15M पंक्ति उदाहरण के लिए समस्या को छोटा किया ===================

%let grps=300000; 
%let pergrp=50; 

अवर्गीकृत:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 300001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   19.26 seconds 
     cpu time   41.35 seconds 

छाँटे गए:

NOTE: There were 15000000 observations read from the data set 
     WORK.TEST. 
NOTE: The data set WORK.SUMMARY has 300001 observations and 9 
     variables. 
NOTE: PROCEDURE SUMMARY used (Total process time): 
     real time   5.43 seconds 
     cpu time   10.09 seconds 

मैं इन कई बार भाग गया और रन बार समान थे। क्रमबद्ध समय लगभग बराबर और तेज़ होते हैं।

प्रति समूह अधिक समूह/कम तेजी से अपरिवर्तित थे, लेकिन कुल CPU उपयोग को देखते हुए, यह अधिक है। मेरे लैपटॉप में एक बेहद तेज एसएसडी है इसलिए आईओ शायद सीमित कारक नहीं था - एचडी बहु-कोर CPU की मांगों को बनाए रखने में सक्षम था। एक धीमी एचडी के साथ एक प्रणाली पर, कुल रन समय अलग हो सकता है।

अंत में, यह डेटा पर संरचित और आपके सर्वर और डीबी के विनिर्देशों के बारे में बहुत अधिक निर्भर करता है।

2

नहीं एक सैद्धांतिक जवाब लेकिन अभी भी प्रासंगिक IMO ...

गति बढ़ाने के लिए अपने proc summary बड़ी टेबल पर अपनी कक्षा बयान के / groupinternal विकल्प जोड़ने। बेशक, यह मानते हुए कि आप समूहबद्ध होने से पहले स्वरूपित चर नहीं चाहते हैं।

उदाहरण के लिए:

class age/groupinternal; 

यह एसएएस बताता है कि यह गणना के समूह के लिए क्या वर्ग में मूल्य से पहले मूल्य के लिए एक प्रारूप लागू करने की आवश्यकता नहीं है। प्रत्येक मान में एक प्रारूप होगा, भले ही आपने स्पष्ट रूप से निर्दिष्ट नहीं किया हो। इससे छोटे टेबल पर बड़ा अंतर नहीं होता है, लेकिन बड़ी टेबल पर यह कर सकता है।

यह साधारण परीक्षण से, यह 40 सेकंड (YMMV) करने के लिए अपने मशीन पर 60 सेकंड से समय कम कर देता है:

data test; 
    set sashelp.class; 
    do i = 1 to 10000000; 
    output; 
    end; 
run; 

proc summary data=test noprint nway missing; 
    class age/groupinternal; 
    var height; 
    output out=smry mean=; 
run; 
+0

अच्छी टिप। दिलचस्प बात यह है कि, 3000x5000 अपरिवर्तित तालिका के मेरे उदाहरण में, इसने प्रसंस्करण को धीमा कर दिया। कुल CPU उपयोग कम था, लेकिन कुल समय अधिक था। समझने के लिए संघर्ष क्यों। – DomPazz

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