هر مجموعه‌ی داده، به قطعاتی تقسیم می‌شود. هر قطعه دارای فضای برداری مستقل، فضای زیرساخت و نمایه است.

داده‌ها در قطعات معمولاً از هم جدا هستند. با این حال، ذخیره کردن یک نقطه یکسان در قطعات مختلف مشکلی ایجاد نمی‌کند زیرا جستجو دارای مکانیزم تکرارزدایی است.

قطعات شامل ذخیره فضای برداری، ذخیره بار، نمایه فضای بردار، نمایه بار و یک نگهدارنده‌ی شناسه برای ذخیره رابطه بین شناسه‌های داخلی و خارجی هستند.

بسته به نوع ذخیره‌سازی و نمایه‌سازی مورد استفاده، قطعات ممکن است "قابل الحاق" یا "غیرقابل الحاق" باشند. در قطعات "قابل الحاق"، می‌توانید به آزادی داده را اضافه، حذف و استعلام کنید، در حالی که در قطعات "غیرقابل الحاق" تنها می‌توانید داده را بخوانید و حذف کنید.

پیکربندی قطعات در یک مجموعه می‌تواند متفاوت و مستقل از یکدیگر باشد، اما حداقل یک قطعه "قابل الحاق" الزامی است.

ذخیره‌سازی بردار

بسته به نیازهای برنامه، Qdrant می‌تواند از یکی از گزینه‌های ذخیره‌سازی داده زیر استفاده کند. انتخاب باید توازن بین سرعت جستجو و استفاده از RAM را داشته باشد.

ذخیره‌سازی حافظه - تمام بردارها را در RAM ذخیره می‌کند و بالاترین سرعت را ارائه می‌دهد زیرا دسترسی به دیسک تنها در زمان پایداری لازم است.

ذخیره‌سازی Memmap - یک فضای آدرس مجازی مرتبط با یک فایل در دیسک ایجاد می‌کند. فایل‌های نقشه‌برداری به طور مستقیم در RAM بارگذاری نمی‌شوند و از طریق حافظه نهان صفحه استفاده می‌شوند. این رویکرد امکان استفاده انعطاف‌پذیر از حافظه موجود را فراهم می‌کند. با کافی بودن RAM، سرعت آن تقریباً به سرعت ذخیره‌سازی حافظه می‌رسد.

پیکربندی ذخیره‌سازی Memmap

دو روش برای پیکربندی استفاده از memmap (همچنین به عنوان ذخیره‌سازی در دیسک شناخته می‌شود) وجود دارد:

  • تنظیم گزینه on_disk برای بردارها در API ایجاد مجموعه:

فقط قابل اجرا در v1.2.0 و نسخه‌های بالاتر

PUT /collections/{collection_name}

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

این کار، یک مجموعه ایجاد می‌کند که فوراً تمام بردارها را در ذخیره‌سازی memmap ذخیره می‌کند. این رویکرد توصیه شده است زمانی که نمونه Qdrant از دیسک‌های سریع استفاده می‌کند و نیاز به مدیریت مجموعه‌های بزرگ دارد.

  • تنظیم گزینه memmap_threshold_kb. این گزینه حداقل را برای تبدیل قطعات به ذخیره‌سازی memmap تعیین می‌کند.

دو روش برای اجرای این کار وجود دارد:

  1. تنظیم حداقل به صورت سراسری در فایل پیکربندی. نام پارامتر memmap_threshold_kb است.
  2. تنظیم حداقل به صورت جداگانه برای هر مجموعه حین ایجاد یا به‌روزرسانی.
PUT /collections/{collection_name}

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

قانون ساده برای تنظیم پارامتر حداقل memmap به این صورت است:

  • اگر سناریوی استفاده متوازن باشد – حداقل memmap را برابر با indexing_threshold (پیش‌فرض 20000) قرار دهید. در این صورت، بهینه‌ساز هیچ اجراهای اضافی انجام نمی‌دهد و تمام حداقل‌ها را یکجا بهینه‌سازی می‌کند.
  • اگر بار نوشتن بالا و RAM کم باشد – حداقل memmap را کمتر از indexing_threshold، به عنوان مثال 10000، قرار دهید. در این صورت، بهینه‌ساز ابتدا قطعات را به ذخیره‌سازی memmap تبدیل کرده و سپس نمایه‌سازی را اعمال می‌کند.

علاوه بر این، می‌توانید از ذخیره‌سازی memmap نه تنها برای بردارها بلکه برای نمایه‌های HNSW نیز استفاده کنید. برای فعالسازی این ویژگی، پارامتر 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 از دو نوع ذخیره‌سازی بارگیری پشتیبانی می‌کند: در حافظه و در دیسک.

ذخیره‌سازی بارگیری در حافظه داده‌های بارگیری را به همان شکل داده‌های بردار در حافظه سازماندهی می‌کند. داده‌های بارگیری هنگامی که سرویس شروع می‌شود در حافظه بارگیری می‌شوند، در حالی که دیسک و RocksDB فقط برای دوام استفاده می‌شود. این نوع ذخیره‌سازی بسیار سریع است اما ممکن است نیازمند فضای حافظه بزرگی برای ذخیره‌سازی تمام داده‌ها باشد، به ویژه اگر بارگیری شامل مقادیر بزرگی باشد (مانند خلاصه‌های متنی یا حتی تصاویر).

بهتر است برای مقادیر بارگیری بزرگ از ذخیره‌سازی بارگیری در دیسک استفاده کنید. این نوع ذخیره‌سازی به طور مستقیم داده‌های بارگیری را به RocksDB می‌خواند و می‌نویسد، بدین ترتیب نیازی به میزان زیادی از حافظه برای ذخیره‌سازی ندارد. با این حال، نقطه ضعف آن لطف دسترسی است. اگر نیاز به پرس‌وجوی بردارها بر اساس شرایط بارگیری دارید، بررسی مقادیر ذخیره‌شده در دیسک ممکن است وقت زیادی طول بکشد. در این صورت، توصیه می‌شود برای هر فیلدی که برای شرایط فیلتر کردن استفاده می‌شود یک فهرست شاخص بارگیری ایجاد کنید تا از دسترسی به دیسک جلوگیری شود. هنگامی که فهرست فیلد ایجاد شود، Qdrant همیشه تمام مقادیر فیلد شاخص را در حافظه نگه می‌دارد، بدون توجه به نوع ذخیره‌سازی بارگیری.

می‌توانید نوع مورد نظر ذخیره‌سازی بارگیری را از طریق فایل پیکربندی تعیین کنید یا با استفاده از پارامتر مجموعهon_disk_payload هنگام ایجاد یک مجموعه.

کنترل نسخه

برای اطمینان از اصلاح داده، Qdrant تمام تغییرات داده را در دو مرحله انجام می‌دهد. ابتدا، داده به ورودی نوشته شده (WAL)، که به ترتیب مرتب و شماره‌های متوالی به تمام عملیات‌ها اختصاص می‌دهد.

با اضافه شدن تغییرات به WAL، حتی در صورت قطع برق هم از دست رفته نمی‌شوند. سپس، تغییرات وارد قطعه می‌شود. هر قطعه آخرین نسخه از تغییرات اعمال شده به آن را نگه می‌دارد، و همچنین نسخه هر نقطه فردی. اگر شماره متوالی یک تغییر جدید کمتر از نسخه فعلی یک نقطه باشد، به‌روزرسانی‌کننده آن تغییر را نادیده می‌گیرد. این مکانیزم به Qdrant امکان بازیابی کارآمد فضا از WAL را در صورت خاموشی نامطلوب می‌دهد.