🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
主頁
  • 管理指南
    • 儲存優化
  • Home
  • Docs
  • 管理指南

  • 儲存優化

  • 使用 mmap

支援 MMap 的資料儲存

在 Milvus 中,記憶體映射檔案允許直接將檔案內容映射到記憶體中。此功能增強了記憶體效率,特別是在可用記憶體稀少但完整資料載入不可行的情況下。此最佳化機制可增加資料容量,同時在一定限度內確保效能;但當資料量超出記憶體太多時,搜尋和查詢效能可能會嚴重下降,因此請視情況選擇開啟或關閉此功能。

配置記憶體映射

從 Milvus 2.4 開始,您可以靈活調整靜態配置檔,在部署前為整個集群配置預設的記憶體映射設定。此外,您也可以選擇動態變更參數,在群集和索引層級微調記憶體映射設定。展望未來,未來的更新將擴展記憶體對應功能,以包含欄位層級的設定。

群集部署前:全局配置

在部署群集之前,群集層級設定會在整個群集套用記憶體對應。這可確保所有新物件都會自動遵循這些組態。值得注意的是,修改這些設定需要重新啟動群集才能生效。

若要調整群集的記憶體映射設定,請編輯configs/milvus.yaml 檔案。在此檔案中,您可以指定是否預設啟用記憶體映射,並決定儲存記憶體映射檔案的目錄路徑。如果未指定路徑 (mmapDirPath),系統預設會將記憶體映射檔案儲存於{localStorage.path}/mmap 。如需詳細資訊,請參閱本機儲存相關組態

# This parameter was set in configs/milvus.yaml
...
queryNode:
  mmap:
    # Set memory mapping property for whole cluster
    mmapEnabled: false | true
    # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. 
    mmapDirPath: any/valid/path 
....

2.4.10 之後,配置queryNode.mmap.mmapEnabled 分成下面四個獨立的欄位,所有預設值都是false

  • queryNode.mmap.vectorField, 控制向量資料是否為 mmap;
  • queryNode.mmap.vectorIndex, 控制向量索引是否為 mmap;
  • queryNode.mmap.scalarField控制標量資料是否為 mmap;
  • queryNode.mmap.scalarIndex控制標量索引是否為 mmap;
# This parameter was set in configs/milvus.yaml
...
queryNode:
  mmap:
    vectorField: false # Enable mmap for loading vector data
    vectorIndex: false # Enable mmap for loading vector index
    scalarField: false # Enable mmap for loading scalar data
    scalarIndex: false # Enable mmap for loading scalar index
....

此外,只有向量索引和向量資料的 mmap 可以單獨為一個集合開啟或關閉,其他集合則無法開啟或關閉。

相容性:如果原始配置queryNode.mmap.mmapEnabled 設定為true ,此時新加入的配置將設定為true 。如果queryNode.mmap.mmapEnabled 設定為false ,如果新增的組態設定為true ,最終值將是true

群集運行期間:動態配置

在群集運行期間,您可以在集合或索引層級動態調整記憶體映射設定。

集合層級,記憶體對應會套用至集合內所有未索引的原始資料,但不包括主索引鍵、時間戳記和行 ID。這種方法特別適用於大型資料集的全面管理。

若要動態調整資料集中的記憶體映射設定,請使用set_properties() 方法。在此,您可以根據需要在TrueFalse 之間切換mmap.enabled

# Get existing collection
collection = Collection("test_collection") # Replace with your collection name

# Set memory mapping property to True or Flase
collection.set_properties({'mmap.enabled': True})

2.4.10 之後,使用add_field 方法來調整資料集中的記憶體對應設定。在此,您可以根據需要在TrueFalse 之間切換mmap_enabled

schema = MilvusClient.create_schema()

schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)

對於索引層級設定,記憶體映射可特別套用至向量索引,而不會影響其他資料類型。此功能對於需要優化向量搜尋效能的資料集來說非常寶貴。

若要啟用或停用集合內索引的記憶體映射,請呼叫alter_index() 方法,在index_name 中指定目標索引名稱,並將mmap.enabled 設為TrueFalse

collection.alter_index(
    index_name="vector_index", # Replace with your vector index name
    extra_params={"mmap.enabled": True} # Enable memory mapping for index
)

在不同部署中自訂儲存路徑

記憶體映射檔案預設為localStorage.path 內的/mmap 目錄。以下是如何在各種部署方法中自訂此設定:

  • 對於使用 Helm Chart 安裝的 Milvus:
# new-values.yaml
extraConfigFiles:
   user.yaml: |+
      queryNode:
         mmap:
           mmapEnabled: true
           mmapDirPath: any/valid/path
        
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
  • 使用 Milvus Operator 安裝的 Milvus:
# patch.yaml
spec:
  config:
    queryNode:
      mmap:
        mmapEnabled: true
        mmapDirPath: any/valid/path
      
 kubectl patch milvus <milvus-name> --patch-file patch.yaml
  • 適用於使用 Docker 安裝的 Milvus:
# A new installation script is provided to enable mmap-related settings.

限制

  • 記憶體映射無法針對已載入的集合啟用,請在啟用記憶體映射前確認該集合已釋放。

  • DiskANN 或 GPU 類索引不支援記憶體映射。

常見問題

  • 建議在哪些情況下啟用記憶體映射?啟用此功能後會有哪些取捨?

    當記憶體有限或效能需求適中時,建議啟用記憶體映射。啟用此功能可增加資料載入的容量。例如,在 2 個 CPU 和 8 GB 記憶體的組態下,啟用記憶體映射可讓載入的資料比未啟用多 4 倍。對效能的影響各有不同:

    • 在記憶體充足的情況下,預期效能與僅使用記憶體的效能相似。

    • 記憶體不足時,預期效能可能會降低。

  • 集合層級和索引層級配置之間的關係是什麼?

    集合層級和索引層級不是包含的關係,集合層級控制原始資料是否啟用 mmap,而索引層級只適用於向量索引。

  • 有沒有任何適用於記憶體映射的推薦索引類型?

    有,建議使用 HNSW 來啟用 mmap。我們之前測試過 HNSW、IVF_FLAT、IVF_PQ/SQ 系列索引,IVF 系列索引的效能下降很嚴重,而 HNSW 索引開啟 mmap 後效能下降仍在預期範圍內。

  • 記憶體映射需要什麼樣的本機儲存空間?

    高品質的磁碟可提升效能,NVMe 硬碟是首選。

  • 標量資料可以進行記憶體映射嗎?

    記憶體映射可應用於標量資料,但不適用於建立在標量欄位上的索引。

  • 不同層級的記憶體映射配置的優先順序如何決定?

    在 Milvus 中,當記憶體映射配置在多個層級中明確定義時,索引層級和集合層級配置共享最高優先級,然後是群集層級配置。

  • 如果我從 Milvus 2.3 升級,並配置了記憶體映射目錄路徑,會發生什麼?

    如果您從 Milvus 2.3 升級,並已配置記憶體映射目錄路徑 (mmapDirPath),您的配置將被保留,啟用記憶體映射的預設設定 (mmapEnabled) 將為true 。遷移元資料以同步您現有記憶體映射檔案的設定是很重要的。如需詳細資訊,請參閱遷移元資料

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?