字典式高效存储scipy/numpy数组

Edw*_*tte 7 python serialization numpy scipy

背景

我正在处理的问题如下:

  • 在我为我的研究设计的实验环境中,我生成了大量的(长度为4M)阵列,这些阵列有点稀疏,因此可以存储为scipy.sparse.lil_matrix实例,或者仅仅作为scipy.array实例存储(空间增益/损失不是'这个问题).

  • 这些数组中的每一个都必须与字符串(即一个单词)配对才能使数据有意义,因为它们是表示该字符串含义的语义向量.我需要保持这种配对.

  • 列表中每个单词的向量是逐个构建的,并在移动到下一个单词之前存储到磁盘.

  • 它们必须以某种方式存储到磁盘,然后可以使用类似字典的语法检索它们.例如,如果所有单词都存储在类似DB的文件中,我需要能够打开这个文件并执行类似的操作vector = wordDB[word].

当前的方法

我目前在做什么:

  • 使用shelve打开一个名为货架wordDB

  • (当前正在使用的向量中的每个时间lil_matrixscipy.sparse)一个单词建立,存储在所述搁板的矢量:wordDB[word] = vector

  • 当我需要在评估过程中使用向量时,我会做相反的事情:打开架子,然后vector = wordDB[word]根据需要对每个单词进行调用,这样就不需要将所有向量都保存在RAM中(是不可能).

上述"解决方案"符合我在解决指定问题方面的需求.问题很简单,当我希望使用这种方法来构建和存储大量单词的向量时,我只是耗尽了磁盘空间.

据我所知,这是因为shelve存储了正在存储的数据,这不是存储大型数组的有效方法,因此使得存储问题难以解决shelve我需要处理的单词数量.

问题

问题是:有没有一种方法可以序列化我的数组,它将:

  1. 将数组本身保存为压缩二进制格式,类似于.npy生成的文件scipy.save

  2. 满足我的要求,数据可以作为字典从磁盘读取,维护单词和数组之间的关联?

And*_*nca 5

正如JoshAdel已经建议的那样,我会选择HDF5,最简单的方法是使用h5py:

http://h5py.alfven.org/

您可以使用sintax这样的字典将多个属性附加到数组:

dset.attrs["Name"] = "My Dataset"
Run Code Online (Sandbox Code Playgroud)

其中dset是您的数据集,可以将其完全切片为numpy数组,但在后台不会将所有数组加载到内存中。