memory - gensim: pickle 还是不 pickle ?

标签 memory model pickle gensim

我有一个关于 gensim 的问题。我想知道在保存或加载模型(或多个模型)时是否建议或需要使用 pickle,因为我在 GitHub 上找到了可以使用的脚本。

mymodel = Doc2Vec(documents, size=100, window=8, min_count=5, workers=4)
      mymodel.delete_temporary_training_data(keep_doctags_vectors=True, keep_inference=True)

here

变体 1:

import pickle
# Save
mymodel.save("mymodel.pkl")  # Stores *.pkl file
# Load
mymodel = pickle.load("mymodel.pkl")

变体 2:

# Save
model.save(mymodel) # Stores *.model file
# Load
model = Doc2Vec.load(mymodel)

gensim.utils 中,我觉得嵌入了一个 pickle 函数:https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/utils.py

默认保存 ... 尝试: _pickle.dump(self, fname_or_handle, 协议(protocol)=pickle_protocol) ...

我的问题的目标: 我很高兴了解 1)我是否需要 pickle(为了更好的内存管理)和 2)以防万一,为什么它比加载 *.model 文件更好。

谢谢!

最佳答案

每当您使用内置的 gensim 函数 save() 存储模型时,无论文件扩展名如何,都会使用 pickle。 documentation for utils告诉我们:

class gensim.utils.SaveLoad

Bases: object

Class which inherit from this class have save/load functions, which un/pickle them to disk.

Warning

This uses pickle for de/serializing, so objects must not contain unpicklable attributes, such as lambda functions etc.

所以只要模型类继承自 gensim.utils.SaveLoad 类,gensim 就会使用 pickle 来保存任何模型。在您的情况下, gensim.models.doc2vec.Doc2Vec 继承自 gensim.models.base_any2vec.BaseWordEmbeddingsModel ,而后者又继承自 gensim.utils.SaveLoad它提供了实际的 save() 函数。

回答您的问题:

  1. 是的,除非您想编写自己的函数,否则您需要 pickle 将模型存储到磁盘。使用 pickle 应该不会有问题,因为 它在标准库中。你甚至不会注意到它。
  2. 如果你使用 gensim save() 您可以选择任何文件扩展名的功能:*.model、*.pkl、*.p、 *。 pickle 。保存的文件将被 pickle 。

关于memory - gensim: pickle 还是不 pickle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655405/

相关文章:

python - 在 pickle 文件中添加新 key

python - pickle 协议(protocol) 2 和 3 之间的巨大大小(以字节为单位)差异

c++ - 为什么使用 QtConcurrent 在另一个线程中读取图像似乎会导致内存泄漏?

linux - Docker 容器上的 ImageMagick 生成格式错误的 PNG 图像

c - 为指针及其数据分配的内存在哪里?

model-view-controller - 模型如何更新 MVC 模式中的 View ?

java - 由 : org. codehaus.jackson.map.JsonMappingException : Can not deserialize instance of com. model.user 超出 START_ARRAY token 引起

memory - Redis 哈希结构并没有像描述的那样提高内存效率

ember.js - 如何在不涉及路由的 setupController 的情况下将属性从一个 Controller 传递到另一个 Controller ?

python - 如何查看 pickle 转储中包含哪些数据?