批量上传向量到Qdrant集合

快速上传大规模数据集可能是一个挑战,但Qdrant有一些技巧可以帮助你解决这个问题。

关于数据上传的第一个重要细节是,瓶颈通常位于客户端,而不是服务器端。 这意味着如果你正在上传一个大型数据集,你应该优先选择一个高性能的客户端库。

我们建议使用我们的Rust客户端库,因为它是Qdrant可用的最快的客户端库。

如果您没有使用Rust,您可能需要考虑并行化您的上传过程。

在上传期间禁用索引

如果您正在首次上传大型数据集,您可能希望在上传期间禁用索引。 这将有助于避免对向量的不必要索引,这些向量将被下一批数据覆盖。

要在上传期间禁用索引,请将indexing_threshold设置为0

PUT /collections/{collection_name}
{
    "vectors": {
      "size": 768,
      "distance": "Cosine"
    },
    "optimizers_config": {
        "indexing_threshold": 0
    }
}
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.create_collection(
    collection_name="{collection_name}",
    vectors_config=models.VectorParams(size=768, distance=models.Distance.COSINE),
    optimizers_config=models.OptimizersConfigDiff(
        indexing_threshold=0,
    ),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.createCollection("{collection_name}", {
  vectors: {
    size: 768,
    distance: "Cosine",
  },
  optimizers_config: {
    indexing_threshold: 0,
  },
});

上传完成后,您可以通过将indexing_threshold设置为所需值(默认值为20000)来启用索引:

PATCH /collections/{collection_name}
{
    "optimizers_config": {
        "indexing_threshold": 20000
    }
}
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.update_collection(
    collection_name="{collection_name}",
    optimizer_config=models.OptimizersConfigDiff(indexing_threshold=20000),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.updateCollection("{collection_name}", {
  optimizers_config: {
    indexing_threshold: 20000,
  },
});

直接上传到磁盘

当你上传的向量无法全部放入内存时,你可能希望使用 memmap 支持。

在集合创建期间,可以使用on_disk参数在每个向量的基础上启用内存映射。这将始终将向量数据直接存储在磁盘上。它适用于摄取大量数据,对于十亿级基准测试至关重要。

在这种情况下,不建议使用memmap_threshold。这将需要优化器不断将内存中的段转换为磁盘上的memmap段。这个过程较慢,并且在处理大量数据时,优化器可能会成为瓶颈。

了解更多信息,请参阅 配置内存映射存储

并行上传到多个分片

在Qdrant中,每个集合被分割成多个分片。每个分片都有一个独立的预写日志(WAL),负责操作的排序。 通过创建多个分片,您可以并行上传大型数据集。每台机器2到4个分片是一个合理的数量。

PUT /collections/{collection_name}
{
    "vectors": {
      "size": 768,
      "distance": "Cosine"
    },
    "shard_number": 2
}
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.create_collection(
    collection_name="{collection_name}",
    vectors_config=models.VectorParams(size=768, distance=models.Distance.COSINE),
    shard_number=2,
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.createCollection("{collection_name}", {
  vectors: {
    size: 768,
    distance: "Cosine",
  },
  shard_number: 2,
});
这个页面有用吗?

感谢您的反馈!🙏

我们很抱歉听到这个消息。😔 你可以在GitHub上编辑这个页面,或者创建一个GitHub问题。