У меня есть собственный класс 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
, чтобы получить сообщение об ошибке.