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

mmap の使用

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

Notes

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

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

概要​

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

EPNvwAI7hhCppbbKmuxcW5VRnUh

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

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

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

グローバル mmap 戦略​

次の表は、異なる階層のクラスターに対するグローバル mmap 戦略をまとめたものです。

mmap の対象

Dedicated クラスター

Free クラスター

Serverless クラスター

Performance-optimized

Capacity-optimized

Tiered-storage

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

無効・変更可能

有効・変更可能

有効・変更不可

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

無効・変更可能

有効・変更可能

有効・変更不可

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

有効・変更可能

有効・変更可能

有効・変更不可

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

無効・変更不可

無効・変更不可

有効・変更不可

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

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

Free および Serverless クラスター、ならびに Extended-capacity CUs を使用する Dedicated クラスターでは、Zilliz Cloud はすべてのフィールドの生データとインデックスに対して 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.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 を構成する​

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

次の例では、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" }
)
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 がすべてのフィールドの生データを完全にメモリにロードするようにできます。

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

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