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

mmap を使用する

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

Notes

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

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

概要​

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

EPNvwAI7hhCppbbKmuxcW5VRnUh

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

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

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

グローバル mmap 戦略​

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

Performance-optimizedCapacity-optimizedTiered-storage
スカラーフィールドの生データDisabled & ChangeableEnabled & ChangeableEnabled & Unchangeable
スカラーフィールドのインデックスDisabled & ChangeableEnabled & ChangeableEnabled & Unchangeable
ベクトルフィールドの生データEnabled & ChangeableEnabled & ChangeableEnabled & Unchangeable
ベクトルフィールドのインデックスDisabled & UnchangeableDisabled & UnchangeableEnabled & Unchangeable

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

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

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 CUs の 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")

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