2011-01-19 9 views
5

मैं बड़ी संख्या में वस्तुओं के लिए ईवेंट घटनाओं के ऐतिहासिक रिकॉर्ड को संग्रहीत करने और पूछताछ के समाधान की जांच कर रहा हूं।पायथन में एल्गोरिदम हजारों क्रमांकित घटनाओं के लिए दैनिक घटना को स्टोर और खोजने के लिए?

यह वह जगह है सरल परिदृश्य: मैं एक दैनिक 200 000 streetlamps का लॉग (sl200000 को SL1 लेबल), जो करता है, तो दीपक दिन हो या नहीं पर परिचालन था पता चलता हो रही है। इससे कोई फर्क नहीं पड़ता कि दीपक सेवा में कितना समय था जब यह किसी दिए गए कैलेंडर दिन पर था।

जानकारी के अन्य टुकड़े के साथ-साथ प्रत्येक दीपक के लिए जमा हो जाती है और अजगर कक्षा की शुरुआत कुछ इस तरह दिखता है:

class Streetlamp(object): 
    """Class for streetlamp record""" 
    def __init__(self, **args): 
     self.location = args['location'] 
     self.power = args['power'] 
     self.inservice = ??? 

मेरे py-foo भी महान नहीं है और मैं एक समाधान से बचने के लिए चाहते हैं जो डिस्क/मेमोरी स्टोरेज पर बहुत लालची है। तो एक वर्ष (वर्ष, महीना, दिन) tuples के एक उपकरण के साथ एक समाधान एक समाधान हो सकता है, लेकिन मैं एक अधिक कुशल समाधान के लिए पॉइंटर्स प्राप्त करने की उम्मीद कर रहा हूँ।

एक रिकॉर्ड जनवरी 1. के साथ शुरू प्रत्येक बिट एक साल के एक दिन का प्रतिनिधित्व इसलिए, अगर एक दीपक परिचालन 2010 की पहली तीन दिन था के साथ एक सा धारा के रूप में संग्रहित किया जा सकता है, तो रिकॉर्ड हो सकता है:

साल सीमाओं के पार
sl1000_up = dict('2010': '11100000000000...', '2011':'11111100100...') 

खोजें मर्ज की आवश्यकता होगी, छलांग साल एक विशेष मामले हैं, के साथ साथ मैं/कोड की जरूरत है कि हम इस घर विकसित समाधान के साथ एक निष्पक्ष बिट डिकोड। यह सही नहीं लगता है। speed-up-bitstring-bit-operations, how-do-i-find-missing-dates-in-a-list और finding-data-gaps-with-bit-masking जहां दिलचस्प पोस्टिंग आईं। मैंने python-bitstring की भी जांच की और कुछ googling किया, लेकिन कुछ भी वास्तव में फिट नहीं लगता है।

इसके अतिरिक्त मैं संभव होने के लिए 'अंतराल' खोजना चाहता हूं, उदा। 'कार्रवाई से तीन या अधिक दिन' और यह आवश्यक है कि ध्वजांकित दिन को वास्तविक कैलेंडर तिथि में परिवर्तित किया जा सके।

मैं संभावित समाधानों के लिए विचारों या पॉइंटर्स की सराहना करता हूं। आगे की जानकारी जोड़ने के लिए, यह ब्याज की बात हो सकती है कि बैक-एंड डीबी का उपयोग जेडओडीबी और शुद्ध पायथन ऑब्जेक्ट्स है जिसे मसालेदार किया जा सकता है।

उत्तर

5

Numpy में एक 2 डी सरणी बनाएँ:

import numpy as np 

nbLamps = 200000 
nbDays = 365 

arr = np.array([nbLamps, nbDays], dtype=np.bool) 

यह बहुत स्मृति कुशल हो जाएगा और आप आसानी से दिन और दीपक समेकित कर सकते हैं।

क्रम दिनों और भी बेहतर में हेरफेर करने के लिए, scikits.timeseries पर एक नजर है। वे आपको डेटाटाइम ऑब्जेक्ट्स के साथ तिथियों तक पहुंचने की अनुमति देंगे।

+0

विज्ञानविदों को इंगित करने के लिए धन्यवाद। टाइम्सरीज़। ऐसा लगता है कि मुझे सबसे अधिक विश्लेषण करना है। एक साल के लिए एक सरणी में सभी दीपक भंडार करना संभव नहीं है, क्योंकि मैं तत्काल वस्तु में एक दीपक के लिए रिकॉर्ड स्टोर करना चाहता हूं। हालांकि, यह अनुकूलित करने के लिए आसान होना चाहिए और numpy के साथ मैं पहिया को शीर्ष reinvent नहीं है। केवल एक पायथन नोब इस पैकेज को अनदेखा कर सकता है ;-) – Axial

+2

यह जानना उचित है कि एक numpy bool पूरे बाइट के रूप में संग्रहीत किया जाता है, इसलिए ऐसा लगता है कि यह मेमोरी कुशल नहीं हो सकता है। –

0

मैं शायद लैंप शब्दकोश और उनमें से प्रत्येक होगा राज्य परिवर्तन जहां पहला तत्व परिवर्तन के समय और दूसरा मूल्य है कि उस समय के बाद से मान्य है की एक सूची शामिल।

इस तरह से जब आप अगले नमूना आप कुछ नहीं करते जब तक कि राज्य पिछले आइटम की तुलना में बदल करने के लिए मिलता है।

खोज त्वरित और कुशल है क्योंकि आप समय पर बाइनरी खोज दृष्टिकोण का उपयोग कर सकते हैं।

बने यह भी आसान है और आप बिना किसी समस्या के शब्दकोश के रूप में दीपक राज्य सूचियों एक मौजूदा और चल व्यवस्था करने के लिए डेटा संलग्न भी रूप में अच्छी तरह आगे संसाधन के उपयोग को कम करने के लिए कर सकते हैं।

यदि आप एक अंतर खोजना चाहते हैं तो आप बस सभी वस्तुओं पर जाएं और अगले और पिछली बार तुलना करें - और यदि आपने राज्य सूचियों को शब्दकोश करने का निर्णय लिया है तो आप इसे प्रत्येक बार अलग-अलग करने में सक्षम होंगे इसके बजाय प्रत्येक दीपक को सूचीबद्ध करें और फिर उन सभी दीपकों को प्राप्त करें जिनके पास एक ही "ऑफ़लाइन" राज्य हैं, केवल एक पुनरावृत्ति के साथ जो कभी-कभी

+0

धन्यवाद! मुझे पसंद है कि यह समाधान विस्तार करना आसान होगा। रिकॉर्ड अच्छी तरह से संग्रहीत किया जा सकता है। फिर भी, मुझे थोड़ा मचान लिखना होगा जो कि पहले से ही पाइलैंड में मौजूद हो सकता है (शायद कुछ वैज्ञानिक डेटा क्रंचिंग मॉड्यूल)। – Axial

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