Python 如何使用HDF存储非常大的矩阵

Python 如何使用HDF存储非常大的矩阵,python,matrix,hdf,Python,Matrix,Hdf,我计划使用HDF来存储一个非常大的矩阵,比如1e6 x 1e6个浮点数 我需要以连续的行或列成批地读取矩阵 我的问题是,构造/调整HDF文件以使速度最大化的最佳方法是什么 有几点: 我估计在我的系统上读取/写入HDF中未压缩的完整矩阵大约需要5个小时。这是合理的,但存储未压缩的矩阵是不合理的,因为它的大小将为数TB 如果矩阵是稀疏的,压缩是否会导致读取速度与读取未压缩的密集矩阵相当,甚至更快 将矩阵分解为单独的子矩阵数据集会很烦人,因为这会使从原始矩阵读取行/列或执行矩阵乘法等操作变得复杂。因此

我计划使用HDF来存储一个非常大的矩阵,比如1e6 x 1e6个浮点数

我需要以连续的行或列成批地读取矩阵

我的问题是,构造/调整HDF文件以使速度最大化的最佳方法是什么

有几点:

我估计在我的系统上读取/写入HDF中未压缩的完整矩阵大约需要5个小时。这是合理的,但存储未压缩的矩阵是不合理的,因为它的大小将为数TB

如果矩阵是稀疏的,压缩是否会导致读取速度与读取未压缩的密集矩阵相当,甚至更快

将矩阵分解为单独的子矩阵数据集会很烦人,因为这会使从原始矩阵读取行/列或执行矩阵乘法等操作变得复杂。因此,如果可能的话,我希望避免这种情况,除非这会带来很大的速度优势

在读了一次矩阵之后,我打算读很多遍。因此,读/解压缩速度比写/压缩速度更重要

我正在使用python h5py与hdf进行接口


我假设您已经在使用一些稀疏表示,例如scipy.sparse中的lil_矩阵

我认为有两个可行的选择

1您可以使用cPickle.dump将二进制内容转储到文件中,请参见例如。

2您可以使用cPickle将内容转储到使用cPickle.dumps的字符串中,然后使用h5py将内容存储为字符串

通常,处理大量数据的成本很高。使用例如lil_矩阵时,矩阵上的操作成本较高。磁盘的读/写操作需要花费一定的时间来存储数据。如果关闭压缩,则将包含字符串的HDF5用于原始C文件的开销将为零。我建议你关闭这个表达式,因为它不会减少太多的大小,它已经很稀疏了