メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

mmapの使用

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

📘注釈

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

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

概要

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

EPNvwAI7hhCppbbKmuxcW5VRnUh

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

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

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

グローバルmmap戦略

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

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

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

拡張容量CUを使用する共有クラスターおよび専用クラスターでは、Zilliz Cloudはすべてのフィールドの生データとインデックスに対してmmapを有効にしてシステムキャッシュを完全に活用し、ホットデータのパフォーマンスを向上させ、コールドデータのコストを削減します。

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

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

📘注釈

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

  • パフォーマンス最適化専用クラスターの場合、すべてのスカラーフィールドの生データとベクトルインデックスが検索およびクエリ中のスカラー検索を迅速に行うためにメモリにロードされます。デフォルトのmmap設定を変更すると、パフォーマンスが低下する可能性があります。

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

特定のフィールドのmmap構成

パフォーマンス最適化の小型CUを使用する専用クラスターを使用しており、データセット内のフィールドの生データが大きい場合は、mmapを有効にしてそのフィールドをコレクションに追加することを検討してください。

以下の例ではパフォーマンス最適化専用クラスターへの接続を前提としており、フィールド追加時にdoc_chunkという名前のVarCharフィールドでmmapを有効にする方法を示しています。

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)

# コレクションのスキーマ作成時にフィールドでmmapを無効化
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)

# 既存のフィールドでmmapを無効化
# 以下は`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構成

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

以下の例では容量最適化専用クラスターへの接続を前提としており、クイック検索のためにtitleという名前のVarCharフィールドのインデックスでmmapを無効にする方法を示しています。

# varcharフィールドを追加
schema.add_field(
field_name="title",
datatype=DataType.VARCHAR,
max_length=512
)

index_params = MilvusClient.prepare_index_params()

# mmap設定でvarcharフィールドにインデックスを作成
index_params.add_index(
field_name="title",
index_type="AUTOINDEX",
params={ "mmap.enabled": "false" }
)

# インデックスのmmap設定を変更
# 以下は`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がすべてのフィールドの生データをメモリに完全にロードするようにすることができます。

以下の例ではパフォーマンス最適化専用クラスターへの接続を前提としており、コレクション作成時にmmapを無効にする方法を示しています。

# コレクション作成時にmmapを有効化
client.create_collection(
collection_name="my_collection",
schema=schema,
properties={ "mmap.enabled": "false" }
)

また、以下のように既存のコレクションのmmap設定を変更することもできます。

# mmap設定を変更する前にコレクションをリリース
client.release_collection("my_collection")

# コレクションがすでにリリースされていることを確認して、
# 以下を実行してください
client.alter_collection_properties(
collection_name="my_collection",
properties={
"mmap.enabled": false
}
)

# 上記の変更を有効にするためにコレクションをロード
client.load_collection("my_collection")

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