Используйте многопроцессорность для создания AnnoyIndex - PullRequest
0 голосов
/ 12 октября 2019

Я использую Annoy для создания решения для ближайшего соседа https://github.com/spotify/annoy

Ниже приведен пример кода из https://www.garysieling.com/blog/python-annoy-glove-example, который я использовал.

from annoy import AnnoyIndex

file = "/Users/gary/Downloads/glove.6B/glove.6B.50d.txt"
content = []
with open(file) as f:
    content = f.readlines()

content = [x.split(" ") for x in content]

t = AnnoyIndex(50) 
idx = 0

terms = [i[0] for i in content]

############## block #####################
for i in content:
  vec = [float(a) for a in i[1:]]
  print(len(vec))
  t.add_item(idx, vec)

  idx = idx + 1
##########################################

t.build(10) # 10 trees
t.save('test.ann')

Поиск:

u = AnnoyIndex(50)
u.load('test.ann')
near = u.get_nns_by_item(0, 10) # nearest 10 terms
nearWords = [terms[i] for i in near]
print(nearWords)

Я пытаюсь применить многопроцессорную обработку к выделенному выше коду, где я в основном перебираю массив содержимого и добавляю индексный вектор в индекс Annoy.

Приведенный выше код работает отлично, но когда я применяю многопроцессорную обработку к этим шагам создания индекса, кажется, что эти векторы не создаются. Ниже я попробовал

from annoy import AnnoyIndex
from multiprocessing import Pool


@memory
@timer
def load_glove_vectors():
    """
    Memory before running load_glove_vectors() is 45.359 Mb
    load_glove_vectors() ran in 4.838 sec
    Memory after running load_glove_vectors() is 1432.250 Mb
    """
    file = "/Users/shekhar/Downloads/glove.6B/glove.6B.50d.txt"
    content = []
    with open(file) as f:
        content = f.readlines()

    content = [x.split(" ") for x in content]
    return content


if __name__ == "__main__":  

    def create_index(x):
        index, vector = x
        vec = [float(v) for v in vector[1:]]
        t.add_item(index, vec)

    content      = load_glove_vectors()
    t            = AnnoyIndex(50, metric='angular')
    terms        = [i[0] for i in content]

    with Pool(4) as p:
        p.map(create_index, enumerate(content))

    build_index()

    t.build(10) # 10 trees
    t.save('test.ann')

    u = AnnoyIndex(50, metric='angular')
    u.load('test1.ann')
    near = u.get_nns_by_item(69, 10) # nearest 10 terms
    nearWords = [terms[i] for i in near]
    print(nearWords)

Это дает следующую ошибку, возможно, потому что индекс еще не создан.

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-9-2f577a14f4c7> in <module>
      1 u = AnnoyIndex(50, metric='angular')
      2 u.load('test1.ann')
----> 3 near = u.get_nns_by_item(69, 10) # nearest 10 terms
      4 nearWords = [terms[i] for i in near]
      5 print(nearWords)

IndexError: Item index larger than the largest item index
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...