हम वर्तमान समय श्रृंखला डेटा के लिए कैसेंड्रा (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 के बारे में कुछ अच्छी बातें सुनी हैं, लेकिन हमारे डेटा की प्रकृति मैट्रिक्स आकार को अज्ञात बनाती है।
हम यह कैसे दृष्टिकोण पर कोई सुझाव के लिए देख रहे हैं। एक पूरी तरह से अलग प्रोग्रामिंग दृष्टिकोण सहित।
गोटो अजगर पैकेज 'pandas' जो' numpy' हुड के नीचे का उपयोग करता है। क्या आपने उसमें देखा है? –
इसके अलावा, "बड़ा" कितना बड़ा है? –
deserialization? –