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

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 を導入して、コレクション内のホットデータとコールドデータのロードのバランスを取ります。上の右図に示すように、capacity-optimized CU を備えた Zilliz Cloud クラスターを使用している場合、Zilliz Cloud はベクトルインデックスのみをメモリにロードし、コレクションをロードするときにすべてのフィールドの生データとスカラーインデックスをメモリーマップします。

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

グローバル mmap 戦略​

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

Performance-optimizedCapacity-optimizedTiered-storage
スカラーフィールドの生データ無効(変更可能)有効(変更可能)有効(変更不可)
スカラーフィールドのインデックス無効(変更可能)有効(変更可能)有効(変更不可)
ベクトルフィールドの生データ有効(変更可能)有効(変更可能)有効(変更不可)
ベクトルフィールドのインデックス無効(変更不可)無効(変更不可)有効(変更不可)

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

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

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

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

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

Notes

mmap 設定を変更する際は注意してください。不適切な mmap 設定は、次の問題を引き起こす可能性があります。

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

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

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

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

次の例では、performance-optimized 専用クラスターに接続することを前提に、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 専用クラスターに接続することを前提に、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 専用クラスターに接続することを前提に、コレクションの作成時に 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")

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