• نبذة عن ميلفوس
  • ابدأ الآن
  • المفاهيم
  • دليل المستخدم
  • النماذج
  • استيراد البيانات
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • البرامج التعليمية
  • الأسئلة الشائعة
  • API Reference

استخدام mmap

يتيح تعيين الذاكرة (Mmap) الوصول المباشر من الذاكرة إلى الملفات الكبيرة على القرص، مما يسمح لـ Milvus بتخزين الفهارس والبيانات في كل من الذاكرة والأقراص الصلبة. يساعد هذا النهج في تحسين سياسة وضع البيانات استناداً إلى تكرار الوصول، مما يزيد من سعة التخزين للمجموعات دون التأثير بشكل كبير على أداء البحث. تساعدك هذه الصفحة على فهم كيفية استخدام Milvus لـ mmap لتمكين تخزين البيانات واسترجاعها بسرعة وكفاءة.

نظرة عامة

يستخدم Milvus المجموعات لتنظيم تضمينات المتجهات وبياناتها الوصفية، ويمثل كل صف في المجموعة كيانًا. كما هو موضح في الشكل الأيسر أدناه، يخزن الحقل المتجه التضمينات المتجهة، بينما تخزن الحقول القياسية بياناتها الوصفية. عندما تقوم بإنشاء فهارس على حقول معينة وتحميل المجموعة، يقوم ميلفوس بتحميل الفهارس التي تم إنشاؤها والبيانات الأولية للحقل في الذاكرة.

Mmap Illustrated الخريطة المصورة

ميلفوس هو نظام قاعدة بيانات كثيف الذاكرة، ويحدد حجم الذاكرة المتاحة سعة المجموعة. من المستحيل تحميل الحقول التي تحتوي على حجم كبير من البيانات في الذاكرة إذا تجاوز حجم البيانات سعة الذاكرة، وهي الحالة المعتادة للتطبيقات التي تعتمد على الذكاء الاصطناعي.

لحل مثل هذه المشكلات، يقدم Milvus نظام mmap لموازنة تحميل البيانات الساخنة والباردة في المجموعات. كما هو موضح في الشكل الأيمن أعلاه، يمكنك تهيئة Milvus لتعيين خرائط الذاكرة للبيانات الأولية في حقول معينة بدلاً من تحميلها بالكامل في الذاكرة. بهذه الطريقة، يمكنك الحصول على وصول مباشر للذاكرة إلى الحقول دون القلق بشأن مشاكل الذاكرة وتوسيع سعة المجموعة.

من خلال مقارنة إجراءات وضع البيانات في الشكلين الأيسر والأيمن، يمكنك معرفة أن استخدام الذاكرة أعلى بكثير في الشكل الأيسر منه في الشكل الأيمن. مع تمكين mmap، يتم إلغاء تحميل البيانات التي كان يجب تحميلها في الذاكرة إلى القرص الصلب وتخزينها مؤقتًا في ذاكرة التخزين المؤقت للصفحات في نظام التشغيل، مما يقلل من بصمة الذاكرة. ومع ذلك، قد يؤدي فشل الوصول إلى ذاكرة التخزين المؤقت إلى تدهور الأداء. لمزيد من التفاصيل، راجع هذه المقالة.

عندما تقوم بتكوين mmap على Milvus، هناك دائمًا مبدأ يجب عليك الالتزام به: احتفظ دائمًا بالبيانات والفهارس التي يتم الوصول إليها بشكل متكرر محملة بالكامل في الذاكرة واستخدم mmap لتلك الموجودة في الحقول المتبقية.

استخدام mmap في ملفوس

يوفر Milvus إعدادات mmap هرمية على المستويات العامة والحقل والفهرس والتجميع، حيث تكون الأولوية لمستوى الفهرس والحقل على مستوى التجميع، ومستوى التجميع على المستوى العام.

إعدادات mmap العامة

الإعداد على مستوى المجموعة هو الإعداد العام وله الأسبقية الأدنى. يوفر Milvus العديد من الإعدادات المتعلقة ب mmap في milvus.yaml. سيتم تطبيق هذه الإعدادات على جميع المجموعات في المجموعة.

...
queryNode:
  mmap:
    scalarField: false
    scalarIndex: false
    vectorField: false
    vectorIndex: false
    # The following should be a path on a high-performance disk
    mmapDirPath: any/valid/path 
....

تكوين العنصر

الوصف

القيمة الافتراضية

queryNode.mmap.scalarField

تحديد ما إذا كان سيتم تعيين تعيين البيانات الأولية لجميع الحقول القياسية في الذاكرة. يؤدي تعيين هذا إلى true إلى جعل Milvus يقوم بتعيين البيانات الأولية لبيانات الحقول العددية للمجموعة في الذاكرة بدلاً من تحميلها بالكامل عند تلقي طلب تحميل مقابل هذه المجموعة.

false

queryNode.mmap.scalarIndex

يحدد ما إذا كان سيتم تعيين تعيين جميع فهارس الحقول العددية في الذاكرة. يؤدي تعيين هذا إلى true إلى جعل Milvus يقوم بتعيين فهارس الحقول العددية للمجموعة في الذاكرة بدلاً من تحميلها بالكامل عند تلقي طلب تحميل مقابل هذه المجموعة.

حاليًا، يتم دعم الحقل العددي فقط باستخدام نوع الفهرس التالي:

  • مقلوب

false

queryNode.mmap.vectorField

يحدد ما إذا كان سيتم تعيين البيانات الأولية لجميع الحقول المتجهة إلى الذاكرة. يؤدي تعيين هذا إلى true إلى جعل Milvus يقوم بتعيين البيانات الأولية لبيانات الحقل المتجه لمجموعة ما في الذاكرة بدلاً من تحميلها بالكامل عند تلقي طلب تحميل مقابل هذه المجموعة.

false

queryNode.mmap.vectorIndex

يحدد ما إذا كان سيتم تعيين تعيين جميع فهارس الحقول المتجهة إلى الذاكرة. يؤدي تعيين هذا الخيار إلى true إلى جعل Milvus يقوم بتعيين فهارس الحقول المتجهة للمجموعة في الذاكرة بدلاً من تحميلها بالكامل عند تلقي طلب تحميل مقابل هذه المجموعة.

حاليًا، يتم دعم الحقول المتجهة التي تستخدم أنواع الفهارس التالية فقط:

  • مسطحة

  • IVF_FLAT

  • IVF_SQ8

  • IVF_PQ

  • BIN_FLAT

  • BIN_IVF_FLAT

  • HNSW

  • SCANN

  • متفرق_مقلوب_مقلوب_الفهرس

  • SPARSE_WAND

false

queryNode.mmap.mmapDirPath

يحدد المسار إلى الملفات المعينة بالذاكرة. تطبق القيمة الافتراضية إذا تُركت غير محددة.

يشير العنصر النائب localStorage.path في القيمة الافتراضية إلى محرك الأقراص الثابتة لـ Milvus QueryNodes. تأكد من احتواء QueryNodes على محرك أقراص ثابتة عالية الأداء للحصول على مزايا mmap المثلى.

{localStorage.path}/mmap

لتطبيق الإعدادات المذكورة أعلاه على مجموعة Milvus العنقودية الخاصة بك، يرجى اتباع الخطوات الواردة في تكوين Milvus مع Helm وتكوين Milvus مع مشغلي Milvus.

في بعض الأحيان، تكون إعدادات mmap العامة غير مرنة عند مواجهة حالات استخدام معينة. ولتطبيق إعدادات بديلة على مجموعة معينة أو فهارسها، فكر في تكوين mmap خاص بمجموعة أو حقل أو فهرس معين. تحتاج إلى تحرير مجموعة وتحميلها قبل أن تدخل التغييرات على إعدادات mmap حيز التنفيذ.

إعدادات mmap الخاصة بالحقل

لتكوين mmap الخاص بالحقل، تحتاج إلى تضمين المعلمة mmap_enabled عند إضافة حقل. يمكنك تمكين mmap mmap على هذا الحقل المحدد عن طريق تعيين هذه المعلمة إلى True.

يوضح المثال التالي كيفية تكوين mmap الخاص بالحقل عند إضافة حقل.

from pymilvus import MilvusClient, DataType

CLUSTER_ENDPOINT="http://localhost:19530"
TOKEN="root:Milvus"

client = MilvusClient(
    uri=CLUSTER_ENDPOINT,
    token=TOKEN
)

schema = MilvusClient.create_schema()
schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=5)

schema = MilvusClient.create_schema()

# Add a scalar field and enable mmap
schema.add_field(
    field_name="doc_chunk",
    datatype=DataType.INT64,
    is_primary=True,
    mmap_enabled=True,
)

# Alter mmap settings on a specific field
# The following assumes that you have a collection named `my_collection`
client.alter_collection_field(
    collection_name="my_collection",
    field_name="doc_chunk",
    field_params={"mmap.enabled": True}
)
import io.milvus.param.Constant;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.*;

import java.util.*;

String CLUSTER_ENDPOINT = "http://localhost:19530";
String TOKEN = "root:Milvus";
client = new MilvusClientV2(ConnectConfig.builder()
        .uri(CLUSTER_ENDPOINT)
        .token(TOKEN)
        .build());
        
CreateCollectionReq.CollectionSchema schema = client.createSchema();

schema.addField(AddFieldReq.builder()
        .fieldName("id")
        .dataType(DataType.Int64)
        .isPrimaryKey(true)
        .autoID(false)
        .build());

schema.addField(AddFieldReq.builder()
        .fieldName("vector")
        .dataType(DataType.FloatVector)
        .dimension(5)
        .build());

Map<String, String> typeParams = new HashMap<String, String>() {{
    put(Constant.MMAP_ENABLED, "false");
}};
schema.addField(AddFieldReq.builder()
        .fieldName("doc_chunk")
        .dataType(DataType.VarChar)
        .maxLength(512)
        .typeParams(typeParams)
        .build());

CreateCollectionReq req = CreateCollectionReq.builder()
        .collectionName("my_collection")
        .collectionSchema(schema)
        .build();
client.createCollection(req);

client.alterCollectionField(AlterCollectionFieldReq.builder()
        .collectionName("my_collection")
        .fieldName("doc_chunk")
        .property(Constant.MMAP_ENABLED, "true")
        .build());
import { MilvusClient, DataType } from '@zilliz/milvus2-sdk-node';

const CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT";
const TOKEN="YOUR_TOKEN";

const client = await MilvusClient({
    address: CLUSTER_ENDPOINT,
    token: TOKEN
});

const schema = [
{
    name: 'vector',
    data_type: DataType.FloatVector
},
{
    name: "doc_chunk",
    data_type: DataType.VarChar,
    max_length: 512,
    'mmap.enabled': false,
}
];

await client.createCollection({
    collection_name: "my_collection",
    schema: schema
});

await client.alterCollectionFieldProperties({
    collection_name: "my_collection",
    field_name: "doc_chunk",
    properties: {"mmap_enable": true}
});
// go
#restful
export TOKEN="root:Milvus"
export CLUSTER_ENDPOINT="http://localhost:19530"

export idField='{
    "fieldName": "id",
    "dataType": "Int64",
    "elementTypeParams": {
        "max_length": 512
    },
    "isPrimary": true,
    "auto_id": false
}'

export vectorField='{
    "fieldName": "vector",
    "dataType": "FloatVector",
    "elementTypeParams": {
       "dim": 5
    }
}'

export docChunkField='{
    "fieldName": "doc_chunk",
    "dataType": "Int64",
    "elementTypeParams": {
        "max_length": 512,
        "mmap.enabled": false
    }
}'

export schema="{
    \"autoID\": false,
    \"fields\": [
        $idField,
        $docChunkField,
        $vectorField
    ]
}"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--data "{
    \"collectionName\": \"my_collection\",
    \"schema\": $schema
}"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/fields/alter_properties" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection",
    "fieldName": "doc_chunk",
    "fieldParams":{
        "mmap.enabled": true
    }
}'

ضع في اعتبارك تمكين mmap للحقول التي تخزن بيانات كبيرة الحجم. كل من الحقول القياسية والحقول المتجهة مدعومة.

بعد ذلك، يمكنك إنشاء مجموعة باستخدام المخطط الذي تم إنشاؤه أعلاه. عند تلقي طلب لتحميل المجموعة، يستخدم Milvus خرائط الذاكرة البيانات الأولية لحقل doc_chunk في الذاكرة.

إعدادات mmap الخاصة بالفهرس

لتكوين mmap الخاص بالفهرس، تحتاج إلى تضمين الخاصية mmap.enabled في معلمات الفهرس عند إضافة الفهرس. يمكنك تمكين mmap على هذا الفهرس المحدد عن طريق تعيين الخاصية إلى true.

يوضح المثال التالي كيفية تكوين mmap الخاص بالفهرس عند إضافة فهرس.

# Add a varchar field
schema.add_field(
    field_name="title",
    datatype=DataType.VARCHAR,
    max_length=512   
)

index_params = MilvusClient.prepare_index_params()

# Create index on the varchar field with mmap settings
index_params.add_index(
    field_name="title",
    index_type="AUTOINDEX",
    params={ "mmap.enabled": "false" }
)

# Change mmap settings for an index
# The following assumes that you have a collection named `my_collection`
client.alter_index_properties(
    collection_name="my_collection",
    index_name="title",
    properties={"mmap.enabled": True}
)
schema.addField(AddFieldReq.builder()
        .fieldName("title")
        .dataType(DataType.VarChar)
        .maxLength(512)
        .build());
        
List<IndexParam> indexParams = new ArrayList<>();
Map<String, Object> extraParams = new HashMap<String, Object>() {{
    put(Constant.MMAP_ENABLED, false);
}};
indexParams.add(IndexParam.builder()
        .fieldName("title")
        .indexType(IndexParam.IndexType.AUTOINDEX)
        .extraParams(extraParams)
        .build());
        
client.alterIndexProperties(AlterIndexPropertiesReq.builder()
        .collectionName("my_collection")
        .indexName("title")
        .property(Constant.MMAP_ENABLED, "true")
        .build());
// Create index on the varchar field with mmap settings
await client.createIndex({
    collection_name: "my_collection",
    field_name: "title",
    params: { "mmap.enabled": false }
});

// Change mmap settings for an index
// The following assumes that you have a collection named `my_collection`
await client.alterIndexProperties({
    collection_name: "my_collection",
    index_name: "title",
    properties:{"mmap.enabled": true}
});
// go
# restful
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection",
    "indexParams": [
        {
            "fieldName": "doc_chunk",
            "params": {
                "index_type": "AUTOINDEX",
                "mmap.enabled": true
            }
        }
    ]
}'

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/alter_properties" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection",
    "indexName": "doc_chunk",
    "properties": {
        "mmap.enabled": false
    }
}'

ينطبق هذا على فهارس كل من الحقول المتجهة والقياسية.

ثم يمكنك الرجوع إلى معلمات الفهرس في مجموعة. عند تلقي طلب لتحميل المجموعة، يقوم ميلفوس بتعيين ذاكرة فهرس حقل العنوان في الذاكرة.

إعدادات mmap الخاصة بالمجموعة

لتكوين إستراتيجية mmap على مستوى المجموعة، تحتاج إلى تضمين الخاصية mmap.enabled في طلب إنشاء مجموعة. يمكنك تمكين mmap لمجموعة من خلال تعيين هذه الخاصية إلى true.

يوضح المثال التالي كيفية تمكين mmap في مجموعة تسمى my_collection عند إنشائها. عند تلقي طلب لتحميل المجموعة، يقوم Milvus بتعيين ذاكرة Milvus للبيانات الأولية لجميع الحقول في الذاكرة.

# Enable mmap when creating a collection
client.create_collection(
    collection_name="my_collection",
    schema=schema,
    properties={ "mmap.enabled": "true" }
)
CreateCollectionReq req = CreateCollectionReq.builder()
        .collectionName("my_collection")
        .collectionSchema(schema)
        .property(Constant.MMAP_ENABLED, "false")
        .build();
client.createCollection(req);
await client.createCollection({
    collection_name: "my_collection",
    scheme: schema,
    properties: { "mmap.enabled": false }
});
// go
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--data "{
    \"collectionName\": \"my_collection\",
    \"schema\": $schema,
    \"params\": {
        \"mmap.enabled\": \"false\"
    }
}"

يمكنك أيضًا تغيير إعدادات mmap لمجموعة موجودة.

# Release collection before change mmap settings
client.release_collection("my_collection")

# Ensure that the collection has already been released 
# and run the following
client.alter_collection_properties(
    collection_name="my_collection",
    properties={
        "mmap.enabled": false
    }
)

# Load the collection to make the above change take effect
client.load_collection("my_collection")
client.releaseCollection(ReleaseCollectionReq.builder()
        .collectionName("my_collection")
        .build());
        
client.alterCollectionProperties(AlterCollectionPropertiesReq.builder()
        .collectionName("my_collection")
        .property(Constant.MMAP_ENABLED, "false")
        .build());

client.loadCollection(LoadCollectionReq.builder()
        .collectionName("my_collection")
        .build());
       
// Release collection before change mmap settings
await client.releaseCollection({
    collection_name: "my_collection"
});

// Ensure that the collection has already been released 
// and run the following
await client.alterCollectionProperties({
    collection_name: "my_collection",
    properties: {
        "mmap.enabled": false
    }
});

// Load the collection to make the above change take effect
await client.loadCollection({
    collection_name: "my_collection"
});
// go
# restful
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/release" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection"
}'

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/alter_properties" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection",
    "properties": {
        "mmmap.enabled": false
    }
}'

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/load" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection"
}'

تحتاج إلى تحرير المجموعة لإجراء تغييرات على خصائصها وإعادة تحميل المجموعة لجعل التغييرات نافذة المفعول.

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟