В чем хранить вектора (эмбендинги) для быстрого сравнения?

Собственно вопрос, в чем хранить вектора лиц, созданные facenet'ом состоящие из 512 вершин, для того что бы их можно было быстр сравнивать. Вектор представляет собой массив, изначально пробовали хранить в postgresql, тип поля cube - но скорость поиска не устраивает. Векторов 50к - и по ним сравнение занимает полторы минуты, это очень долго. Потом пробовали хранить вектора в json, скорость увеличилась, поиск стал занимать 12 секунд, но всё равно это очень долго. Много времени занимает именно само преобразование строки в массив, так вот вопрос, в чем хранить вектор, что бы python сразу получал массив. Или может быть какой нибудь другой метод посоветуете.
  • Вопрос задан
  • 872 просмотра
Пригласить эксперта
Ответы на вопрос 2
sgjurano
@sgjurano
Разработчик
Вот статья про методы приближенного поиска ближайших соседей:
https://m.habr.com/ru/company/mailru/blog/338360/

Если вкратце, то поиск по HNSW-индексу из 500к векторов будет укладываться в 5 миллисекунд. Библиотеку лучше взять faiss, она поприличнее написана, чем оригинальный nmslib. У обеих есть Python-биндинги.
Ответ написан
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
50k * 512 * 8 * 3 = 600MB

Попробуйте в оперативке хранить, numpy-массивами. Плюс есть структура KD Tree, позволяющая искать ближайших соседей вектора по K-мерному линейному пространству. Ускорит поиск.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы