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

2024-10-01 11:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

我正在处理的问题如下:

  • 在我为我的研究设计的一个实验中,我产生了大量的大数组(长度为4M),这些数组有点稀疏,因此可以存储为scipy.sparse.lil_matrix实例,也可以简单地存储为scipy.array实例(空间增益/损失不是这里的问题)。

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

  • 列表中每个单词的向量是一个接一个构建的,并存储在磁盘上,然后再转到下一个单词。

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

当前方法

我现在在做什么:

  • 使用shelve打开名为wordDB

  • 每次构建单词的向量(当前使用lil_matrix来自scipy.sparse)时,将向量存储在工具架中:wordDB[word] = vector

  • 当我需要在计算过程中使用向量时,我会做相反的操作:打开工具架,然后根据需要对每个单词执行vector = wordDB[word]来调用向量,这样就不需要将所有向量保存在RAM中(这是不可能的)。

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

据我所知,这是因为shelve对正在存储的数据进行pickle处理,这不是存储大数组的有效方法,因此对于我需要处理的字数,shelve使这个存储问题变得棘手。在

问题

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

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

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


Tags: 文件数据方法scipy数组单词向量matrix
3条回答

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

http://h5py.alfven.org/

可以使用sintax之类的字典将多个属性附加到数组:

dset.attrs["Name"] = "My Dataset"

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

我建议使用scipy.save.保存在单词和文件名之间要有一段措辞。在

您是否尝试过使用cPickle直接使用以下命令来pickle字典:

import cPickle
DD = dict()
f = open('testfile.pkl','wb')
cPickle.dump(DD,f,-1)
f.close()

或者,如果需要的话,我可以使用hdf5或netcdf将向量保存在一个大的多维数组中,因为这允许您打开一个大数组,而无需一次将其全部放入内存,然后根据需要获取切片。然后,您可以将单词作为netcdf4/hdf5文件中的一个附加组进行关联,并使用通用索引从每个组中快速关联相应的片段,或者只将该组命名为单词,然后将数据作为向量。你得玩玩哪个更有效。在

http://netcdf4-python.googlecode.com/svn/trunk/docs/netCDF4-module.html

Pytables也可能是HDF5之上的一个有用的存储层:

http://www.pytables.org

相关问题 更多 >