2016-02-04 21 views
5

हम वर्तमान समय श्रृंखला डेटा के लिए कैसेंड्रा (http://cassandra.apache.org/) का उपयोग कर रहे हैं। कैसंद्रा पढ़ने पर बहुत तेज़ है, लेकिन हमें इसे पेश करने से पहले हमारे डेटा पर गणनाओं की एक श्रृंखला करना है (प्रभावी रूप से हम एसयूएम की नकल कर रहे हैं और एसक्यूएल की कार्यक्षमताओं के समूह को ग्रुप कर रहे हैं - कुछ कैसंड्रा बॉक्स से बाहर नहीं है)पायथन में बड़े वेब डेटा सेट - बहुत बड़े सरणी से निपटने के लिए कैसे?

हम अजगर (एक हद तक) से परिचित हैं और हमारे कैसेंड्रा क्लस्टर क्वेरी करने के लिए एक स्क्रिप्ट का निर्माण करने के साथ ही गणित प्रदर्शन करेंगे और JSON प्रारूप में परिणाम पेश करने का फैसला किया:

query = (
    "SELECT query here...") 

startTimeQuery = time.time() 

# Executes cassandra query 
rslt = cassession.execute(query) 

print("--- %s seconds to query ---" % (time.time() - startTimeQuery)) 

tally = {} 

startTimeCalcs = time.time() 
for row in rslt: 
    userid = row.site_user_id 

    revenue = (int(row.revenue) - int(row.reversals_revenue or 0)) 
    accepted = int(row.accepted or 0) 
    reversals_revenue = int(row.reversals_revenue or 0) 
    error = int(row.error or 0) 
    impressions_negative = int(row.impressions_negative or 0) 
    impressions_positive = int(row.impressions_positive or 0) 
    rejected = int(row.rejected or 0) 
    reversals_rejected = int(row.reversals_rejected or 0) 

    if tally.has_key(userid): 
     tally[userid]["revenue"] += revenue 
     tally[userid]["accepted"] += accepted 
     tally[userid]["reversals_revenue"] += reversals_revenue 
     tally[userid]["error"] += error 
     tally[userid]["impressions_negative"] += impressions_negative 
     tally[userid]["impressions_positive"] += impressions_positive 
     tally[userid]["rejected"] += rejected 
     tally[userid]["reversals_rejected"] += reversals_rejected 
    else: 
     tally[userid] = { 
      "accepted": accepted, 
      "error": error, 
      "impressions_negative": impressions_negative, 
      "impressions_positive": impressions_positive, 
      "rejected": rejected, 
      "revenue": revenue, 
      "reversals_rejected": reversals_rejected, 
      "reversals_revenue": reversals_revenue 
     } 


print("--- %s seconds to calculate results ---" % (time.time() - startTimeCalcs)) 

startTimeJson = time.time() 
jsonOutput =json.dumps(tally) 
print("--- %s seconds for json dump ---" % (time.time() - startTimeJson)) 

print("--- %s seconds total ---" % (time.time() - startTimeQuery)) 

print "Array Size: " + str(len(tally)) 

यह आउटपुट की तरह है हम पाते हैं:

--- 0.493520975113 seconds to query --- 
--- 23.1472680569 seconds to calculate results --- 
--- 0.546246051788 seconds for json dump --- 
--- 24.1871240139 seconds total --- 
Array Size: 198124 

हम अपनी गणनाओं पर बड़ी मात्रा में खर्च कर रहे हैं, हम जानते हैं कि समस्या इतनी अधिक नहीं है कि रकम और समूह स्वयं ही हैं: यह केवल उस सरणी का आकार है जो मुद्दा है।

हमने numpy के बारे में कुछ अच्छी बातें सुनी हैं, लेकिन हमारे डेटा की प्रकृति मैट्रिक्स आकार को अज्ञात बनाती है।

हम यह कैसे दृष्टिकोण पर कोई सुझाव के लिए देख रहे हैं। एक पूरी तरह से अलग प्रोग्रामिंग दृष्टिकोण सहित।

+2

गोटो अजगर पैकेज 'pandas' जो' numpy' हुड के नीचे का उपयोग करता है। क्या आपने उसमें देखा है? –

+2

इसके अलावा, "बड़ा" कितना बड़ा है? –

+0

deserialization? –

उत्तर

0

कैसेंड्रा 2.2 और बाद में उन कुल कार्यों को परिभाषित करने के लिए अनुमति देता है। आप इसे कैसंड्रा पक्ष पर कॉलम संग्रह करने के लिए उपयोग कर सकते हैं। उपयोगकर्ता परिभाषित समेकन

1

के बारे में डेटा के लिए DataStax article देखें, मैंने प्रसंस्करण का एक बहुत ही समान टुकड़ा किया है और मैं प्रसंस्करण के समय के बारे में भी चिंतित था। मुझे लगता है कि आप कुछ महत्वपूर्ण के लिए लेखांकन नहीं कर रहे हैं: परिणामकी वापसी के रूप में आपको कैसंड्रा से प्राप्त परिणाम ऑब्जेक्ट में आपकी इच्छित सभी पंक्तियां नहीं हैं। इसके बजाय, इसमें एक पृष्ठित परिणाम होता है, और for सूची के अंदर ऑब्जेक्ट के माध्यम से आप साफ़ करते समय लाइनें प्राप्त करेंगे। यह व्यक्तिगत अवलोकन पर आधारित है, हालांकि, मुझे इसके बारे में अधिक तकनीकी विवरण नहीं पता है।

मैं तुम्हें सही execute आदेश के बाद एक सरल rslt = list(rslt) जोड़ने प्रसंस्करण करने से पहले कि अजगर परिणाम में सभी लाइनों के माध्यम से जाने के लिए मजबूर हैं, यह भी सभी प्राप्त करने के लिए कैसेंड्रा चालक मजबूर कर क्वेरी और परिणाम के प्रसंस्करण को अलग करने का सुझाव प्रसंस्करण करने से पहले आप चाहते हैं लाइनें।

मुझे लगता है कि आप पाएंगे कि प्रसंस्करण समय आप था का एक बहुत वास्तव में क्वेरी करने गया था, लेकिन यह एक पृष्ठवार परिणाम के माध्यम से चालक के नीचे दब गया था। timeseries डेटा के लिए

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