प्रत्येक डेटा संग्रह को सेगमेंट में विभाजित किया जाता है। प्रत्येक सेगमेंट में स्वतंत्र वेक्टर संग्रहण, भार संग्रहण, और सूची होती है।

सेगमेंट में संग्रहित डेटा सामान्यतया एक दूसरे से अवर्तित नहीं होता है। हालांकि, एक ही बिन्दु को विभिन्न सेगमेंट में संग्रहित करने से समस्या नहीं होती क्योंकि खोज में एक डीडुप्लिकेशन यांत्रिकी होती है।

सेगमेंट में वेक्टर संग्रहण, भार संग्रहण, वेक्टर सूची, भार सूची, और आंतरिक और बाह्य आईडी के बीच संबंध संग्रहित करने के लिए आईडी मैपर शामिल होती है।

सेगमेंट "अपेंडेबल" या "गैर-अपेंडेबल" हो सकती है आधार स्तर और सूची के प्रकार पर निर्भर करता है। "अपेंडेबल" सेगमेंट में आप डेटा को मुक्त रूप से जोड़ सकते, हटा सकते, और प्रश्न पूछ सकते हैं, जबकि "गैर-अपेंडेबल" सेगमेंट में सिर्फ पढ़ सकते और डेटा हटा सकते हैं।

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

वेक्टर संग्रहण

अनुप्रयोग की जरूरतों के आधार पर, Qdrant मेमोरी संग्रहण विकल्पों में से किसी एक का उपयोग कर सकता है। चयन को खोज गति और रैम का उपयोग संतुलित होना चाहिए।

मेमोरी संग्रहण - सभी वेक्टर्स को रैम में संग्रहित करता है, जिससे सबसे अधिक गति प्राप्त होती है क्योंकि सत्यापन के दौरान डिस्क एक्सेस की आवश्यकता केवल होती है।

मेम्महप संग्रहण - डिस्क पर फाइल से जुड़े एक आदर्श पता अंतरिक्ष बनाता है। मैप की गई फाइलें सीधे रैम में लोड नहीं होती हैं बल्कि पेज कैशिंग का प्रयोग करके उपयोग किया जाता है। यह उपाय उपलब्ध रैम का प्रयोग उचित ढंग से करने देता है। पर्याप्त रैम के साथ, इसकी गति मेमोरी संग्रहण की तुलना में लगभग तेज होती है।

मेम्महप संग्रहण को विन्यसित करना

मेम्महप का उपयोग करने के दो तरीके होते हैं (जिसे ऑन-डिस्क संग्रहण भी कहा जाता है):

  • संग्रह निर्माण API में वेक्टर्स के लिए 'ऑन_डिस्क' विकल्प सेट करें:

केवल v1.2.0 और उच्चतर के लिए लागू होता है

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 768,
      "distance": "Cosine",
      "on_disk": true
    }
}

इससे एक संग्रह बनाया जाएगा जो तुरंत सभी वेक्टर्स को मेम्महप संग्रहण में संग्रहित करेगा। यह अनुशंसित तरीका है जब Qdrant इंस्टेंस तेज डिस्क प्रयोग करता है और बड़े संग्रहों का संभालना करने की आवश्यकता होती है।

  • memmap_threshold_kb विकल्प सेट करें। यह विकल्प सेगमेंट को मेम्महप संग्रहण में रूपांतरित करने के लिए अंक का थ्रेशोल्ड सेट करता है।

इसे लागू करने के दो तरीके होते हैं:

  1. विन्यास फ़ाइल में थ्रेशोल्ड को समूह स्तर पर सेट करें। पैरामीटर का नाम memmap_threshold_kb होता है।
  2. निर्माण या अद्यतन के दौरान प्रत्येक संग्रह के लिए थ्रेशोल्ड को व्यक्तिगत रूप से सेट करें।
PUT /collections/{collection_name}

{
    "vectors": {
      "size": 768,
      "distance": "Cosine"
    },
    "optimizers_config": {
        "memmap_threshold": 20000
    }
}

मेम्महप थ्रेशोल्ड पैरामीटर सेट करने के लिए नियम सरल है:

  • यदि उपयोग स्थिति संतुलित है – मेम्महप थ्रेशोल्ड को 'इंडेक्सिंग थ्रेशोल्ड' के बराबर सेट करें (डिफ़ॉल्ट 20000 है)। इस मामले में, अपशिष्टकरण संचालक को कोई अतिरिक्त रन नहीं करना होगा और वह सभी थ्रेशोल्ड को एक साथ अनुकूलित करेगा।
  • यदि लेखन भार अधिक है और रैम कम है – मेम्महप थ्रेशोल्ड 'इंडेक्सिंग थ्रेशोल्ड' से कम सेट करें, उदाहरण के लिए 10000। इस मामले में, अपशिष्टकरण संचालक पहले सेगमेंट को मेम्महप संग्रहण में रूपांतरित करेगा और फिर इंडेक्सिंग लागू करेगा।

इसके अलावा, आप मेम्महप संग्रहण को वेक्टर्स के अलावा एचएनएसडब्ल्यू इंडेक्स के लिए भी उपयोग कर सकते हैं। इस सुविधा को सक्षम करने के लिए, संग्रह निर्माण करते समय hnsw_config.on_disk पैरामीटर को true सेट करें।

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 768,
      "distance": "Cosine"
    },
    "optimizers_config": {
        "memmap_threshold": 20000
    },
    "hnsw_config": {
        "on_disk": true
    }
}

डाटा भंडारण

Qdrant दो प्रकार के डाटा भंडारण का समर्थन करता है: InMemory और OnDisk।

InMemory डाटा भंडारण मेमोरी में डाटा को उन्नति विचार के तरीके से संगठित करता है। सेवा प्रारंभ होते ही पेलोड डेटा को मेमोरी में लोड किया जाता है, जबकि डिस्क और RocksDB केवल सहयता के लिए प्रयोग होते हैं। यह प्रकार का भंडारण बहुत तेज़ होता है लेकिन सभी डेटा को संग्रहीत करने के लिए बड़े मात्रा में मेमोरी स्थान की आवश्यकता हो सकती है, खासकर अगर पेलोड में बड़े मान (जैसे पाठ संक्षेप या तस्वीरें) शामिल हैं।

बड़े पेलोड मानों के लिए, OnDisk पेलोड भंडारण का उपयोग करना अधिक उत्तम है। इस प्रकार के भंडारण में पेलोड को सीधे RocksDB में पढ़ा-लिखा जाता है, इसलिए भंडारण के लिए बड़े मात्रा में मेमोरी की आवश्यकता नहीं होती है। हालांकि, इसका नुकसान पहुंच समय होता है। अगर आपको पेलोड शर्तों पर वेक्टर्स की क्वेरी करनी है, तो डिस्क पर संग्रहित मानों की जांच करने में बहुत समय लग सकता है। इस मामले में, हम सुझाव देते हैं कि प्रत्येक फ़ील्ड के लिए फ़िल्टरिंग शर्तों के लिए पेलोड सूची बनाएं। एक बार फ़ील्ड सूची बनाई गई है, Qdrant हमेशा सभी निर्धारित फ़ील्ड के मानों को मेमोरी में रखेगा, पेलोड भंडारण प्रकार को देखते हुए।

आप संग्रहण पैरामीटर on_disk_payload का उपयोग करके या विन्यास फ़ाइल के माध्यम से इच्छित पेलोड भंडारण प्रकार को निर्धारित कर सकते हैं।

संस्करण नियंत्रण

डेटा अखंडता सुनिश्चित करने के लिए, Qdrant दो चरणों में सभी डेटा परिवर्तन करता है। पहले, डेटा को Write-ahead-log (WAL) में लिखा जाता है, जो सभी परिवर्तनों को क्रमिक संख्याओं से संवर्गित और क्रियाओं को देता है।

एक बार जब परिवर्तनों को WAL में जोड़ दिया गया है, तो वे बिजली की गोली के मामले में भी नहीं खो जाते हैं। फिर, परिवर्तन सेगमेंट में आते हैं। प्रत्येक सेगमेंट उसमें लागू किए गए परिवर्तनों का नवीनतम संस्करण संग्रहित करता है, साथ ही प्रत्येक व्यक्ति बिंदु का संस्करण। अगर किसी नए परिवर्तन की क्रमिक संख्या व्यक्ति के वर्तमान संस्करण से कम है, तो अपडेटर उस परिवर्तन को नजरअंदाज करेगा। यह तंत्र Qdrant को असामान्य बंदी पर अस्थिरित से संग्रहण को कुशलतापूर्वक पुनर्प्राप्त करने में सहायक बनाता है।