メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

mmap の使用

メモリマップ (Mmap) により、ディスク上の大容量ファイルへの直接メモリアクセスが可能になり、Zilliz Cloud はインデックスとデータをメモリとハードドライブの両方に保存できます。このアプローチは、アクセス頻度に基づいてデータ配置ポリシーを最適化し、検索パフォーマンスに影響を与えることなくコレクションのストレージ容量を拡張するのに役立ちます。このページでは、Zilliz Cloud が mmap を使用してどのように高速かつ効率的なデータ保存と取得を実現するかについて説明します。

📘Notes

異なるプランを持つソースクラスターとターゲットクラスター間でデータを移行または復元する場合、ソースコレクションの mmap 設定はターゲットクラスターへ移行されません。ターゲットクラスターで mmap 設定を手動で再構成してください。

Zilliz Cloud では、プログラム経由または Web コンソールを通じて mmap 設定を構成できます。このページでは、プログラムによる mmap 設定方法に焦点を当てます。Web コンソールでの操作の詳細については、コレクションの管理 (コンソール) を参照してください。

概要

Zilliz Cloud は、ベクトル埋め込みとそのメタデータを整理するためにコレクションを使用し、コレクション内の各行がエンティティを表します。以下の左図に示すように、ベクトルフィールドにはベクトル埋め込みが格納され、スカラーフィールドにはそのメタデータが格納されます。特定のフィールドにインデックスを作成し、コレクションをロードすると、Zilliz Cloud は作成されたインデックスとすべてのフィールドの生データをメモリにロードします。

EPNvwAI7hhCppbbKmuxcW5VRnUh

Zilliz Cloud クラスターはメモリ集約型のデータベースシステムであり、利用可能なメモリサイズがコレクションの容量を決定します。AI 駆動型アプリケーションでは一般的なことですが、データサイズがメモリ容量を超えると、大量のデータを含むフィールドをメモリにロードすることは不可能です。

このような問題を解決するため、Zilliz Cloud は mmap を導入し、コレクション内のホットデータとコールドデータのロードバランスを図っています。上記の右図に示すように、容量最適化済み CU を備えた Zilliz Cloud クラスターを使用している場合、コレクションをロードする際にベクトルインデックスのみをメモリにロードし、すべてのフィールドの生データとスカラーインデックスをメモリマップします。

左右の図におけるデータ配置手順を比較すると、左図の方がメモリ使用量がはるかに高いことがわかります。mmap を有効にすると、本来メモリにロードされるべきデータがハードドライブにオフロードされ、オペレーティングシステムのページキャッシュにキャッシュされるため、メモリフットプリントが削減されます。ただし、キャッシュヒットの失敗によりパフォーマンスが低下する可能性があります。詳細については、この記事 を参照してください。

グローバル mmap 戦略

以下の表は、異なるティアのクラスターに対するグローバル mmap 戦略を示しています。

パフォーマンス最適化済み

容量最適化済み

ティアードストレージ

スカラーフィールド生データ

無効 & 変更可能

有効 & 変更可能

有効 & 変更不可

スカラーフィールドインデックス

無効 & 変更可能

有効 & 変更可能

有効 & 変更不可

ベクトルフィールド生データ

有効 & 変更可能

有効 & 変更可能

有効 & 変更不可

ベクトルフィールドインデックス

無効 & 変更不可

無効 & 変更不可

有効 & 変更不可

パフォーマンス最適化済み CU を使用するクラスターでは、Zilliz Cloud はベクトルフィールドの生データに対してのみ mmap を有効にし、スカラーフィールドの生データおよびすべてのフィールドインデックスをメモリにロードします。検索およびクエリ中のメタデータフィルタリングと取得のパフォーマンスを確保するため、グローバル設定を維持することを推奨します。ただし、メタデータフィルタリングに関与せず、出力フィールドとしても使用されないフィールドについては、引き続き mmap を有効にすることができます。

容量最適化済み CU を使用するクラスターでは、Zilliz Cloud は自動インデックス作成のためベクトルフィールドインデックスに対する mmap を無効にし、スカラーフィールドのインデックスおよびすべてのフィールドの生データをメモリマップすることで、最大のストレージ容量を確保します。メタデータフィルタリング条件で使用されるフィールドや出力フィールドに記載されているフィールドの生データが大きすぎて、それらをハードドライブに残すと応答が遅くなったりネットワークジッターが発生したりする場合は、これらのフィールドに対する mmap を無効にして検索パフォーマンスを向上させることを検討してください。

拡張容量 CU を使用するクラスターおよび専用クラスターでは、Zilliz Cloud はすべてのフィールドの生データとインデックスに対して mmap を有効にし、システムキャッシュを最大限に活用してホットデータのパフォーマンスを向上させ、コールドデータのコストを削減します。

コレクション固有の mmap 設定

mmap 設定を変更するにはコレクションをリリースし、変更を有効にするために再度ロードする必要があります。特定のフィールド、フィールドインデックス、またはコレクション全体に対して mmap を構成できます。

📘Notes

mmap 設定の変更は慎重に行ってください。不適切な mmap 設定により、以下の問題が発生する可能性があります。

  • パフォーマンス最適化済みの専用クラスターでは、検索およびクエリ中にスカラーフィールドを高速に取得できるよう、デフォルトですべてのスカラーフィールドの生データとベクトルインデックスがメモリにロードされます。デフォルトの mmap 設定を変更すると、パフォーマンスが低下する可能性があります。

  • 容量最適化済みの専用クラスターでは、最大のストレージ容量を確保するため、デフォルトでベクトルインデックスのみがメモリにロードされます。デフォルトの mmap 設定を変更すると、メモリ不足 (OOM) によりロードに失敗する可能性があります。

特定のフィールド向けの mmap 構成

小規模なパフォーマンス最適化済み CU を備えた専用クラスターを使用しており、データセット内の特定のフィールドの生データが大きい場合は、mmap を有効にした状態でそのフィールドをコレクションに追加することを検討してください。

以下の例では、パフォーマンス最適化済みの専用クラスターへの接続を想定し、doc_chunk という名前の VarChar フィールドを追加する際に、そのフィールドで mmap を有効にする方法を示します。

from pymilvus import MilvusClient, DataType

CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
TOKEN="YOUR_CLUSTER_TOKEN"

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)

# Disable mmap on a field upon creating the schema for a collection
schema.add_field(
field_name="doc_chunk",
datatype=DataType.INT64,
max_length=512,
mmap_enabled=False,
)

client.create_collection(collection_name="my_collection", schema=schema)

# Disable mmap on an existing 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}
)

上記のスキーマを使用して作成されたコレクションをロードする際、Zilliz Cloud は doc_chunk フィールドの生データをメモリマップします。フィールドの mmap 設定を変更するには、まずコレクションをリリースし、変更後に再度コレクションをロードする必要があることに注意してください。

スカラーフィールドのインデックスに対する mmap の設定

メタデータフィルタリングに使用される、または出力フィールドとして使用されるスカラーフィールドについては、それらをメモリにロードし、他のスカラーフィールドはハードディスク上に保持することを検討してください。

以下の例では、容量最適化型の専用クラスターに接続していることを前提として、クイックな取得のために title という名前の VarChar フィールドのインデックスに対する 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}
)

上記のインデックスパラメータを使用して作成されたコレクションをロードする際、Zilliz Cloud は title フィールドのインデックスをメモリに読み込みます。フィールドの mmap 設定を変更するには、まずコレクションをリリースし、変更後に再度コレクションをロードする必要があることに注意してください。

コレクションでの mmap の設定

コレクションで mmap 設定を無効にすることで、Zilliz Cloud がすべてのフィールドの生データを完全にメモリに読み込むようにできます。

以下の例では、パフォーマンス最適化型の専用クラスターに接続していることを前提として、コレクション作成時に mmap を無効にする方法を示します。

# Enable mmap when creating a collection
client.create_collection(
collection_name="my_collection",
schema=schema,
properties={ "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")

コレクションのプロパティを変更するには、一度コレクションをリリースし、変更を有効にするために再度コレクションをリロードする必要があります。