Python сериализовать ha sh таблицу с numpy - PullRequest
0 голосов
/ 09 мая 2020

У меня есть собственный класс InMemoryStorage(BaseStorage), определенный как

class InMemoryStorage(BaseStorage):
    def __init__(self, config):
        self.name = 'dict'
        self.storage = dict()

    def keys(self):
        return self.storage.keys()

    def set_val(self, key, val):
        self.storage[key] = val

    def get_val(self, key):
        return self.storage[key]

    def append_val(self, key, val):
        self.storage.setdefault(key, []).append(val)

    def get_list(self, key):
        return self.storage.get(key, [])

, который расширяет «абстрактный» класс class BaseStorage(object). Этот класс содержит объект storage dict:

self.storage = dict()

Я сохраняю в этом dict numpy ndarray и сериализую его в файл:

np.savez_compressed(self.hashtable_filename,
                    *self.hash_tables)

где значение объекта для хранения представляет собой кортеж, например

((10, 12, 99, 1, 5, 31, 2, 3), 'vec1')

, являющийся ключом ha sh вычисленным целым числом (на основе вектора для сохранения), например ключом 111110.

Перед записью ha sh таблицу в файл через savez_compressed, мой ha sh выглядит так:

for i, table in enumerate(self.hash_tables):
                    print(table)
                    for key in table.keys():
                        val = table.get_val(key)
                        print(key,val)

<lshash.storage.InMemoryStorage object at 0x10bfd4d90>
100010 [((10, 12, 99, 1, 5, 31, 2, 3), 'vec1'), ((10, 11, 94, 1, 4, 31, 2, 3), 'vec2')]
<lshash.storage.InMemoryStorage object at 0x10bfd4c90>
111000 [((10, 12, 99, 1, 5, 31, 2, 3), 'vec1'), ((10, 11, 94, 1, 4, 31, 2, 3), 'vec2')]

, но если я попытался повторно загрузить значения, оказалось, что они не были сохранены правильным образом:

npzfiles = np.load(self.hashtable_filename)
npzfiles = sorted(npzfiles.items(), key=lambda x: x[0])
hash_tables = [t[1] for t in npzfiles]

for i, table in enumerate(hash_tables):
      print("stored",table)
      for key in table.keys():
      val = table.get_val(key)
          print(key,val)

На самом деле я получаю объект numpy.ndarray, а не InMemoryStorage, который я должен был сериализовать:

stored <lshash.storage.InMemoryStorage object at 0x110dba210>
Traceback (most recent call last):
  File "example.py", line 46, in <module>
    lsh.save()
  File "/Users/loretoparisi/Documents/MyProjects/lshash/lshash/lshash.py", line 281, in save
    for key in table.keys():
AttributeError: 'numpy.ndarray' object has no attribute 'keys'

, что дает ошибку при попытке доступа к методу key() для InMemoryStorage экземпляр объекта.

Код для воспроизведения этой ошибки: здесь . Просто установите и запустите example.py, чтобы получить сообщение об ошибке.

...