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

mmap を使用する

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

Notes

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

Zilliz Cloud では、mmap 設定をプログラムまたは Web コンソールから構成できます。このページでは、mmap をプログラムで設定する方法に焦点を当てます。Web コンソールでの操作の詳細については、Manage Collections (Console) を参照してください。

概要​

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

EPNvwAI7hhCppbbKmuxcW5VRnUh

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

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

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

グローバル mmap 戦略​

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

Mmap 対象

Dedicated クラスター

Free クラスター

Serverless クラスター

Performance-optimized

Capacity-optimized

Tiered-storage

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

無効・変更可能

有効・変更可能

有効・変更不可

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

無効・変更可能

有効・変更可能

有効・変更不可

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

有効・変更可能

有効・変更可能

有効・変更不可

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

無効・変更不可

無効・変更不可

有効・変更不可

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

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

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

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

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

Notes

mmap 設定を変更する際は注意が必要です。不適切な mmap 設定は、以下の問題を引き起こす可能性があります。

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

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

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

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

次の例では、Performance-optimized の 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.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 を構成する​

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

次の例では、Capacity-optimized の 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" }
)

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

次の例では、Performance-optimized の Dedicated クラスターに接続することを前提とし、コレクションを作成するときに mmap を無効にする方法を示します。

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

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