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

mmap を使用する

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

📘注意

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

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

概要

Zilliz Cloud は、vector embedding とそのメタデータを整理するために collection を使用し、collection 内の各行は 1 つの entity を表します。以下の左図に示すように、vector field には vector embedding が格納され、scalar field にはそのメタデータが格納されます。特定の field に index を作成して collection をロードすると、Zilliz Cloud は作成された index とすべての field の生データをメモリにロードします。

EPNvwAI7hhCppbbKmuxcW5VRnUh

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

このような問題を解決するために、Zilliz Cloud は collection 内のホットデータとコールドデータのロードのバランスを取るために mmap を導入しています。上の右図に示すように、容量最適化 CUs を持つ Zilliz Cloud cluster を使用している場合、collection をロードすると、Zilliz Cloud は vector index のみをメモリにロードし、すべての field の生データと scalar index をメモリマップします。

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

グローバル mmap 戦略

次の表は、異なる tier の cluster に対するグローバル mmap 戦略を示しています。

Performance-optimizedCapacity-optimizedTiered-storage
Scalar field の生データDisabled & ChangeableEnabled & ChangeableEnabled & Unchangeable
Scalar field indexDisabled & ChangeableEnabled & ChangeableEnabled & Unchangeable
Vector field の生データEnabled & ChangeableEnabled & ChangeableEnabled & Unchangeable
Vector field indexDisabled & UnchangeableDisabled & UnchangeableEnabled & Unchangeable

Performance-optimized CUs を使用する cluster では、Zilliz Cloud は vector field の生データに対してのみ mmap を有効にし、scalar field の生データおよびすべての field index をメモリにロードします。検索およびクエリ中のメタデータフィルタリングと取得のパフォーマンスを確保するため、グローバル設定をそのまま維持することを推奨します。ただし、メタデータフィルタリングに関与しない field や、出力 field として使用されない field については、mmap を有効にすることも可能です。

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

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

Collection 固有の mmap 設定

mmap 設定を変更するには collection を release する必要があり、変更を有効にするには再度 load する必要があります。特定の field、field index、または collection に対して mmap を構成できます。

📘注意

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

  • Performance-optimized の dedicated cluster では、検索およびクエリ中に scalar field を高速に取得できるよう、すべての scalar field の生データと vector index がデフォルトでメモリにロードされます。デフォルトの mmap 設定を変更すると、パフォーマンス低下を招く可能性があります。

  • Capacity-optimized の dedicated cluster では、最大のストレージ容量を確保するために、vector index のみがデフォルトでメモリにロードされます。デフォルトの mmap 設定を変更すると、メモリ不足(OOM)の問題により load 失敗を引き起こす可能性があります。

特定の field に対して mmap を構成する

小規模な Performance-optimized CUs を持つ dedicated cluster を使用していて、データセット内のある field の生データが大きい場合は、mmap を有効にした状態でその field を collection に追加することを検討してください。

次の例では、Performance-optimized の dedicated cluster に接続することを前提とし、doc_chunk という名前の VarChar field を追加する際に 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}
)

上記の schema を使用して作成された collection をロードすると、Zilliz Cloud は doc_chunk field の生データをメモリマップします。field の mmap 設定を変更するには collection を release する必要があり、変更後は collection を再度 load する必要があることに注意してください。

Scalar index に対して mmap を構成する

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

次の例では、Capacity-optimized の dedicated cluster に接続することを前提とし、title という名前の VarChar field の index に対して 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}
)

上記の index パラメータを使用して作成された collection をロードすると、Zilliz Cloud は title field の index をメモリにロードします。field の mmap 設定を変更するには collection を release する必要があり、変更後は collection を再度 load する必要があることに注意してください。

コレクションで mmap を設定する

コレクションで mmap 設定を無効にすると、Zilliz Cloud はすべてのフィールドの生データを完全にメモリに読み込みます。

次の例では、パフォーマンス最適化された専用クラスターに接続していることを前提とし、コレクション作成時に 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")

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

Ctrl I