操作 FAQ

    • 程序执行时主进程中无 client
    • 每个子进程分别创建 client 进行操作

    以下为正确程序的示例(部分细节如 import multiprocessing as mp 需自行修改)。

    当表名为 TABLE_NAME,且已插入 vector_1 的表存在时,直接在主程序中直接调用该函数,两个 insert 进程和一个 search 进程同时执行,且能获得正确结果。其中需注意的是,search 的结果与当前正在 insert 的向量无关。

    其中 即为主进程所起 client,程序将会持续执行,直至 timeout。

    1. def test_add_vector_search_multiprocessing(self, connect, table):
    2. '''
    3. target: test add vectors, and search it with multiprocessing
    4. method: set vectors_1[0] as query vectors
    5. expected: status ok and result length is 1
    6. '''
    7. nq = 5
    8. vectors_2 = gen_vectors(nq, dim)
    9. status, ids = connect.add_vectors(table, vectors_1)
    10. time.sleep(3)
    11. assert count == 5
    12. def add_vectors_search(connect, idx):
    13. if (idx % 2) == 0:
    14. status, ids = connect.add_vectors(table, vectors_2)
    15. assert status.OK()
    16. status, result = connect.search_vectors(table, 1, [vectors_1[0]])
    17. assert status.OK()
    18. assert len(result) == 1
    19. process_num = 3
    20. processes = []
    21. p = Process(target=add_vectors_search, args=(connect, i))
    22. processes.append(p)
    23. p.start()
    24. for p in processes:
    25. p.join()

    在 Milvus 支持的索引类型中,IVFLATIVF_SQ8 是基于 k-means 空间划分的分桶搜索算法。空间被分为 nlist 个桶,导入的向量被分配存储在基于 nlist 划分的文件结构中。搜索发生时,只搜索最近似的 nprobe 个文件。

    想要避免这种情况,您可以尝试将 设置为更大值,或是把 nlist 和 K 设置小一点。

    产品 FAQ