【发布时间】:2011-03-16 18:30:09
【问题描述】:
背景
我正在处理的问题如下:
-
1234563
这些数组中的每一个都必须与一个字符串(即一个词)配对才能使数据有意义,因为它们是表示该字符串含义的语义向量。 我需要保留这个配对。
列表中每个单词的向量都是一个接一个地构建的,并在移动到下一个单词之前存储到磁盘中。
它们必须以一种随后可以使用类似字典的语法检索的方式存储到磁盘。例如,如果所有单词都存储在类似 DB 的文件中,我需要能够打开此文件并执行
vector = wordDB[word]之类的操作。
scipy.array 实例(空间增益/损失不是这里的问题)。
目前的方法
我目前在做什么:
使用
shelve打开一个名为wordDB的书架每次构建一个单词的向量(当前使用来自
scipy.sparse的lil_matrix)时,将向量存储在架子中:wordDB[word] = vector当我需要在评估过程中使用向量时,我会做相反的事情:打开书架,然后根据需要对每个单词执行
vector = wordDB[word]来调用向量,这样就不会全部向量需要保存在 RAM 中(这是不可能的)。
上述“解决方案”符合我在解决指定问题方面的需求。问题很简单,当我希望使用这种方法为大量单词构建和存储向量时,我只是用完了磁盘空间。
据我所知,这是因为shelve 腌制了正在存储的数据,这不是存储大型数组的有效方式,因此对于我的字数而言,shelve 难以解决这个存储问题需要处理。
问题
因此问题是:有没有一种方法可以序列化我的数组集:
以类似于
.npy由scipy.save生成的文件的压缩二进制格式保存数组本身?满足我的要求,即数据可以作为字典从磁盘读取,保持单词和数组之间的关联?
【问题讨论】:
-
只是为了确保您使用协议 2 进行酸洗(在您的货架上),对吗? docs.python.org/library/pickle.html#data-stream-format如果不指定协议,默认为0,效率最低。
-
事实上...我不知道。我有点假设它会默认为最实用的。我只是测试一下协议 2 是否对我的数据有显着的空间增益。感谢您指出这一点!
-
我还假设它默认使用最有利的协议并且之前被烧毁,这就是我想问的原因。我想默认是协议 0,而是出于遗留原因。
-
如我的回答所示,您可以使用
-1或cPickle.HIGHEST_PROTOCOL始终使用最新的(并且我假设未来,最有效的)酸洗协议。此外,cPickle与Pickle相比,您将获得更好的性能。 -
好的,使用协议二将所需的存储空间减半。遗憾的是,这还不够,但这是一个很好的进步。我得看看这个 hdf5 的东西......
标签: python serialization numpy scipy