मैं मोंगोडब में समय श्रृंखला कैसे संग्रहीत करूं


11

मुझे समय श्रृंखला का एक डेटाबेस बनाने की जरूरत है, और निम्नलिखित कार्य करने हैं:

  • नई समय श्रृंखला बनाएँ
  • मौजूदा समय श्रृंखला अद्यतन करें
  • क्वेरी एक या कई बार श्रृंखला में एक साथ (उदाहरण के लिए एक ही तिथि के लिए सभी समय श्रृंखला ...)

क्या मानगो उस के अनुकूल है और यदि हाँ, तो मुझे डेटाबेस को कैसे तैयार करना चाहिए? (वन टाइम सेरी = वन डॉक्यूमेंट? या वन डॉक्यूमेंट = टाइम सीरी की एक प्रविष्टि, और इन सभी दस्तावेजों से कलेक्शन बनता है जो पूरे टाइम सीरीज़ है?)

मैं यहां थोड़ा खो गया हूं और मुझे कोई भी जानकारी मिलना मुश्किल है क्योंकि आम तौर पर मैंगो को बहुत ही लचीला रूप में प्रस्तुत किया जाता है ताकि उपयोगकर्ता के पास बुनियादी ढांचे में विकल्प हो।

ट्यूटोरियल का कोई भी लिंक जो विशेष रूप से बताता है कि कैसे मानगो में समय श्रृंखला का प्रबंधन किया जाता है, बहुत स्वागत है।

धन्यवाद!



एक अद्यतन श्वेत पत्र है जो MongoDB में समय-श्रृंखला पर चर्चा करता है। mongodb.com/collateral/time-series-best-practices
रॉबर्ट वाल्टर्स

जवाबों:


6

मेरा सुझाव है कि प्रति दस्तावेज एक ही समय श्रृंखला प्रविष्टि। प्रति दस्तावेज़ कई प्रविष्टियाँ संग्रहीत करने में कुछ समस्याएं हैं:

  • एक एकल दस्तावेज़ एक निश्चित आकार (वर्तमान में 16 एमबी) तक सीमित है; यह सीमित करता है कि एक दस्तावेज़ में कितनी प्रविष्टियाँ संग्रहीत की जा सकती हैं
  • क्योंकि दस्तावेज़ में अधिक प्रविष्टियाँ जोड़ी जाती हैं, पूरे दस्तावेज़ (और समय श्रृंखला) को अनावश्यक रूप से हटा दिया जाएगा और स्मृति के एक बड़े टुकड़े को पुनः प्राप्त किया जाएगा
  • नियमित दस्तावेजों पर प्रश्नों की तुलना में उप-दस्तावेजों पर प्रश्न सीमित हैं
  • बहुत सपाट संरचनाओं वाले दस्तावेज़ (जैसे प्रत्येक सेकंड के लिए एक उप-दस्तावेज़) प्रदर्शन करने वाले नहीं होते हैं
  • अंतर्निहित मानचित्र-कम उप-दस्तावेजों पर भी काम नहीं करता है

यह भी ध्यान दें कि एक टाइमस्टैम्प को डिफ़ॉल्ट MongoDB ObjectId में बनाया गया है । आप इसका उपयोग कर सकते हैं यदि समय श्रृंखला सटीक एक सेकंड से कम है।

यहाँ एक उदाहरण BSON दस्तावेज़ है जो लॉगिंग लाइब्रेरी से है जो MongoDB का उपयोग करता है :

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

चूंकि इवेंट लॉग एक टाइम सीरीज़ के समान है, इसलिए यह बाकी कोड का अध्ययन करने के लायक हो सकता है । जावा, सी #, पीएचपी और पायथन में संस्करण हैं।

यहां एक और समान ओपन सोर्स प्रोजेक्ट है: जरकोव


[अपडेट] @ रॉकसाइंस की टिप्पणी के जवाब में, मैं कुछ और संदर्भ जोड़ रहा हूं:


अगर मेरी टाइम सीरीज़ में कई सालों का डेटा है तो दस्तावेजों की बहुत कमी हो जाएगी !!! क्या इतने सारे दस्तावेज होना कोई समस्या नहीं है? एक sql पृष्ठभूमि से आ रहा है, मुझे लगता है कि यह बहुत प्रभावी नहीं है। (जैसा कि एक ही समय श्रृंखला के सभी डेटा बिंदु के लिए बहुत अधिक पुनरावृत्ति होगी)
रॉकसाइंस

@RockScience: कई अन्य NoSQL डेटाबेस की तरह MongoDB, लचीलापन, गति और कम CPU उपयोग जैसी अन्य चीजों के पक्ष में सामान्यीकरण और मेमोरी दक्षता बढ़ाता है। यदि आपको मेमोरी दक्षता की आवश्यकता है, तो MongoDB आपके लिए सही समाधान नहीं हो सकता है। MongoDB ज़ोर से रोने के लिए प्रत्येक दस्तावेज़ में प्रत्येक फ़ील्ड का पूरा पाठ नाम कॉपी करता है ! वैसे भी, मैंने अपने जवाब को कुछ और संसाधनों के साथ अपडेट किया है, जिसमें मोंगोबडी को बहुत बड़ी समय श्रृंखला को संग्रहीत करने के लिए कैसे उपयोग किया गया था, इसका एक केस अध्ययन भी शामिल है।
लेफ्टियम सेप

2

मुझे यह सवाल SO ( /programming/4814167/storing-time-series-data-relational-or-non ) पर मिला जहां ओपी पूछते हैं कि टाइम सीरीज़ को कैसे स्टोर किया जाए। यद्यपि उनका प्रश्न NoSQL डेटाबेस या RDBMS का उपयोग करने के आसपास अधिक आधारित है, और आप NoSQL db का उपयोग करते हुए बहुत ही सुंदर लगते हैं।

इस लेख को " द यूनिक डेटाबेस रिक्वायरमेंट्स ऑफ टाइम-सीरीज़ डेटा " पर भी मिला, जो उपयोगी हो सकता है।

उम्मीद है की यह मदद करेगा।


2

हाँ, निश्चित रूप से, NoSQL डेटाबेस पारंपरिक RDBMS की तुलना में बेहतर समय डेटा संग्रहीत करता है।

हाँ MongoDB असाधारण रूप से इस उपयोग के मामले में अनुकूलित है।

-आपको डेटाबेस को कैसे तैयार करना चाहिए? एक दस्तावेज़ = एक समय श्रृंखला इनपुट वी.एस. एकाधिक समय श्रृंखला।

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

यहाँ एक स्कीमा उदाहरण दिया गया है कि कैसे एक मिनट के अंतराल के साथ समय-समय पर घंटे के मूल्य को स्टोर किया जाए:

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

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

यहां एक ट्यूटोरियल का लिंक दिया गया है, जो विशेष रूप से बताता है कि कैसे MongoDb में आधिकारिक MongoDb ब्लॉग से टाइम सीरीज़ प्रबंधित करें: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-in MongoDB


1
किसी दस्तावेज़ के भीतर डेटा को बकेट करना प्रदर्शन और संसाधन उपयोग से बेहतर होगा। MongoDB सर्वोत्तम प्रथाओं श्वेत पत्र के लिए अद्यतन समय श्रृंखला पर तीन स्कीमा परिदृश्यों पर चर्चा की गई है। mongodb.com/collateral/time-series-best-practices
रॉबर्ट वाल्टर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.