问题描述
def get_model(config:dict):
return gensim.models.Word2Vec.load(config['path_model']).wv
是否可以打开一次,将其保存在缓存或redis中,然后再次使用以加快搜索速度?
我已经尝试过这个选项:
model = get_model(config)
pickled_object = pickle.dumps(model)
key = 'model_object'
redis_instance.set(key,pickled_object)
然后我明白了:
t0 = time.time()
get_object = redis_instance.get('model_object')
t1 = time.time()
total = t1-t0
print('Get object',total)
t0 = time.time()
model = pickle.loads(get_object)
t1 = time.time()
total = t1-t0
print('Pickle loads',total)
但处理时间没有改变。
Mar 30 09:47:54 ip-172-31-25-211 gunicorn[27354]: Get object 1.2066564559936523
Mar 30 09:47:54 ip-172-31-25-211 gunicorn[27354]: Pickle loads 0.854522705078125
解决方法
您想将模型保存在内存中是正确的,因此加载成本不会在每个请求中都被重复支付。
但是将它混入 Redis 并不是最好的方法。
有关相关想法,请参阅此旧答案:
How to speed up Gensim Word2vec model load time?
但请注意,在刚刚发布的 Gensim-4.0.0 中事情变得更容易了 - 您不需要进行 init_sims
或 syn0norm
修补。简单地用 mmap='r'
加载它可能就足够了,通常的相似性操作不会使用那么多额外的内存或步骤。