gensim 没有文件句柄的负载,

d4so4syb  于 3个月前  发布在  其他
关注(0)|答案(5)|浏览(39)

通过utils.SaveLoad,一些类(如Corups)提供使用文件名或类似文件的对象(fname_or_handle)进行保存。然而,相应的加载方法只允许文件名,这使得在非标准文件系统下使用时更加繁琐。
如果这个功能(添加从类似文件对象加载的能力)是可取的,我很高兴能发送一个PR。

lpwwtiir

lpwwtiir1#

感谢@digitalex的报告,你能给我举一个fname_or_handle方法在load方法中有用的例子吗?主要问题是save方法可以生成多个文件(而不仅仅是一个),因此,load方法只接受唯一的文件名。

goqiplq2

goqiplq22#

能够从文件句柄中加载数据将会非常棒。正如@menshikh-iv所说,这将限制您只能保存一个文件的对象。请注意,您可以使用普通的cPickle.dump / cPickle.load实现相同的效果。您将无法使用内存Map(mmap),并且受到pickle的最大大小(3GB IIRC)等的限制。但它可能仍然涵盖了许多用例。

我看到使用gensim的load(handle)而不是pickle.load(handle)的一个优点是,一些类在load中使用了额外的逻辑,例如检查向后兼容性等。您无法在使用pickle时获得这一点。

ahy6op9u

ahy6op9u3#

另一个要点:gensim内部使用smart_open,这样用户可以透明地从S3、HDFS、压缩等(而不仅仅是本地文件系统)进行保存/加载。因此,处理加载功能应该期望一个最小的“类似文件”对象,而不是依赖于太多仅针对本地文件系统的操作(即使seek也很棘手)。不过,一个简单的.read()总是可以的。

vd8tlhqk

vd8tlhqk4#

我目前遇到的一个例子是,将数据保存到我们类似于HDFS的专有分布式文件系统中,因为我想用MapReduce作业构建语料库和后来的LSI模型,输入和输出必须发送到我们的文件系统,而不是工作节点上的本地文件。
我意识到了几个文件的问题,这是一个很好的观点,我之前没有意识到。也许可以通过使用pickle的persistent_id特性来克服这个问题,但我不能说这听起来像是一个绝妙的想法。
我的备份策略是按照@piskvorky的建议,自己进行pickling/unpickling操作。我可能可以使用save(),因为我相信如果它获得了一个文件句柄(对象具有'write'属性),那么它只会保存一个文件(使用pickle)。

3okqufwl

3okqufwl5#

这是一个有趣的想法,使用persistent_id,用自定义的picklers/unpicklers代替自定义的保存/加载。
无论如何,为文件句柄添加支持将是非常棒的@digitalex。你能在PR中添加这个功能吗?

相关问题