メインコンテンツまでスキップ

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 クラスターを使用している場合、コレクションをロードすると、Zilliz Cloud はベクトルインデックスのみをメモリに読み込み、すべてのフィールドの生データとスカラーインデックスをメモリマップします。

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

グローバル mmap 戦略​

次の表に、異なる階層のクラスターに対するグローバル mmap 戦略を示します。

mmap の対象

Dedicated クラスター

Free クラスター

Serverless クラスター

パフォーマンス最適化

容量最適化

階層型ストレージ

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

無効・変更可能

有効・変更可能

有効・変更不可

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

無効・変更可能

有効・変更可能

有効・変更不可

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

有効・変更可能

有効・変更可能

有効・変更不可

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

無効・変更不可

無効・変更不可

有効・変更不可

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

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

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

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

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

Notes

mmap 設定を変更する場合は注意が必要です。不適切な mmap 設定により、次の問題が発生する可能性があります。

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

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

特定のフィールドの mmap を構成する​

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

次の例は、パフォーマンス最適化 Dedicated クラスターに接続していることを前提とし、doc_chunk という名前の VarChar フィールドを追加する際に、そのフィールドで mmap を有効にする方法を示しています。

python
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.VARCHAR,
max_length=512,
mmap_enabled=False,
)

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

# Enable 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 を構成する​

メタデータフィルタリングに関与するスカラーフィールドや、出力フィールドとして使用されるスカラーフィールドは、他のスカラーフィールドをハードドライブに保持したまま、メモリに読み込むことを検討してください。

次の例は、容量最適化 Dedicated クラスターに接続していることを前提とし、title という名前の VarChar フィールドのインデックスで mmap を無効にして、高速に取得する方法を示しています。

python
# 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" }
)
client.create_index(collection_name="my_collection", index_params=index_params)

# 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 はすべてのフィールドの生データをメモリに完全に読み込みます。

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

python
# Disable mmap when creating a collection
client.create_collection(
collection_name="my_collection",
schema=schema,
properties={ "mmap.enabled": "false" }
)

既存のコレクションの mmap 設定は、次のように変更することもできます。

python
# 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")

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