通过utils.SaveLoad,一些类(如Corups)提供使用文件名或类似文件的对象(fname_or_handle)进行保存。然而,相应的加载方法只允许文件名,这使得在非标准文件系统下使用时更加繁琐。如果这个功能(添加从类似文件对象加载的能力)是可取的,我很高兴能发送一个PR。
utils.SaveLoad
lpwwtiir1#
感谢@digitalex的报告,你能给我举一个fname_or_handle方法在load方法中有用的例子吗?主要问题是save方法可以生成多个文件(而不仅仅是一个),因此,load方法只接受唯一的文件名。
fname_or_handle
load
save
goqiplq22#
能够从文件句柄中加载数据将会非常棒。正如@menshikh-iv所说,这将限制您只能保存一个文件的对象。请注意,您可以使用普通的cPickle.dump / cPickle.load实现相同的效果。您将无法使用内存Map(mmap),并且受到pickle的最大大小(3GB IIRC)等的限制。但它可能仍然涵盖了许多用例。
cPickle.dump
cPickle.load
mmap
我看到使用gensim的load(handle)而不是pickle.load(handle)的一个优点是,一些类在load中使用了额外的逻辑,例如检查向后兼容性等。您无法在使用pickle时获得这一点。
load(handle)
pickle.load(handle)
ahy6op9u3#
另一个要点:gensim内部使用smart_open,这样用户可以透明地从S3、HDFS、压缩等(而不仅仅是本地文件系统)进行保存/加载。因此,处理加载功能应该期望一个最小的“类似文件”对象,而不是依赖于太多仅针对本地文件系统的操作(即使seek也很棘手)。不过,一个简单的.read()总是可以的。
smart_open
seek
.read()
vd8tlhqk4#
我目前遇到的一个例子是,将数据保存到我们类似于HDFS的专有分布式文件系统中,因为我想用MapReduce作业构建语料库和后来的LSI模型,输入和输出必须发送到我们的文件系统,而不是工作节点上的本地文件。我意识到了几个文件的问题,这是一个很好的观点,我之前没有意识到。也许可以通过使用pickle的persistent_id特性来克服这个问题,但我不能说这听起来像是一个绝妙的想法。我的备份策略是按照@piskvorky的建议,自己进行pickling/unpickling操作。我可能可以使用save(),因为我相信如果它获得了一个文件句柄(对象具有'write'属性),那么它只会保存一个文件(使用pickle)。
persistent_id
save()
3okqufwl5#
这是一个有趣的想法,使用persistent_id,用自定义的picklers/unpicklers代替自定义的保存/加载。无论如何,为文件句柄添加支持将是非常棒的@digitalex。你能在PR中添加这个功能吗?
5条答案
按热度按时间lpwwtiir1#
感谢@digitalex的报告,你能给我举一个
fname_or_handle
方法在load
方法中有用的例子吗?主要问题是save
方法可以生成多个文件(而不仅仅是一个),因此,load
方法只接受唯一的文件名。goqiplq22#
能够从文件句柄中加载数据将会非常棒。正如@menshikh-iv所说,这将限制您只能保存一个文件的对象。请注意,您可以使用普通的
cPickle.dump
/cPickle.load
实现相同的效果。您将无法使用内存Map(mmap
),并且受到pickle的最大大小(3GB IIRC)等的限制。但它可能仍然涵盖了许多用例。我看到使用gensim的
load(handle)
而不是pickle.load(handle)
的一个优点是,一些类在load
中使用了额外的逻辑,例如检查向后兼容性等。您无法在使用pickle时获得这一点。ahy6op9u3#
另一个要点:gensim内部使用
smart_open
,这样用户可以透明地从S3、HDFS、压缩等(而不仅仅是本地文件系统)进行保存/加载。因此,处理加载功能应该期望一个最小的“类似文件”对象,而不是依赖于太多仅针对本地文件系统的操作(即使seek
也很棘手)。不过,一个简单的.read()
总是可以的。vd8tlhqk4#
我目前遇到的一个例子是,将数据保存到我们类似于HDFS的专有分布式文件系统中,因为我想用MapReduce作业构建语料库和后来的LSI模型,输入和输出必须发送到我们的文件系统,而不是工作节点上的本地文件。
我意识到了几个文件的问题,这是一个很好的观点,我之前没有意识到。也许可以通过使用pickle的
persistent_id
特性来克服这个问题,但我不能说这听起来像是一个绝妙的想法。我的备份策略是按照@piskvorky的建议,自己进行pickling/unpickling操作。我可能可以使用
save()
,因为我相信如果它获得了一个文件句柄(对象具有'write'属性),那么它只会保存一个文件(使用pickle)。3okqufwl5#
这是一个有趣的想法,使用
persistent_id
,用自定义的picklers/unpicklers代替自定义的保存/加载。无论如何,为文件句柄添加支持将是非常棒的@digitalex。你能在PR中添加这个功能吗?