2016-09-16 39 views
1

在linux 64bit环境中,我有非常大的float64阵列(单个将500GB到1TB)。我想以统一的方式在numpy中访问这些数组:a [x:y]。所以我不想以分段文件的形式访问数组。有什么工具可以在许多不同的文件上创建memmap吗? hdf5或pytables可以将单个CArray存储到许多小文件中吗?也许类似于fileInput的东西?或者我可以使用文件系统来模拟单个文件吗?如何将超大型数组保存到许多小文件中?

在matlab中,我一直在使用H5P.set_external来做到这一点。然后我可以创建一个原始数据集并将其作为一个大的原始文件进行访问。但我不知道是否可以在Python中的这些数据集上创建numpy.ndarray。或者我可以将一个数据集传播到许多小型的hdf5文件中?

不幸的是,H5P.set_chunk不能用于H5P.set_external,因为set_external仅适用于连续数据类型不是分块数据类型。

一些相关的话题: Chain datasets from multiple HDF5 files/datasets

+0

您可以使用'numpy.memmap'数组,它使用磁盘而不是内存。 [检查此示例](http://stackoverflow.com/a/16633274/832621) –

+0

它可以将多个文件映射到单个数组吗? – Wang

+0

我知道'memmap'可以将多个数组映射到一个文件中,但从来没有试图用多个文件来映射一个数组。也许这是不可能的使用默认的'memmap'类 –

回答

1

我会用HDF5。在h5py,您可以指定块大小,这使得检索小块阵列的效率:

http://docs.h5py.org/en/latest/high/dataset.html?#chunked-storage

+0

不是链接是关于单个hdf5文件中的几个数据集?我希望能够将多个不同文件中的数据集视为一个文件。你能指点一个方向,我可以在哪里找到这些信息? – Wang

+0

我建议将整个数组放入一个HDF5文件。然后,HDF5将处理将数据分块成小块磁盘空间,以便您可以高效地访问阵列外核。除非你在某种程度上限制了生成阵列的系统已经写入许多小文件。 – JoshAdel

+0

那么,一个大文件不是一个选项。它需要在许多小文件中。我想避免复制TB级别的数据。 – Wang

1

您可以使用daskdaskarrays允许您创建一个对象,其行为类似于一个大的numpy数组,但表示存储在many small HDF5 files中的数据。 dask将负责确定您执行的任何操作如何与您的底层磁盘数据相关。

+1

尽管这是一个很好的建议,但由于一个相当重要的限制,我不相信这一点:dask数组不能被其他数组索引。请参阅http://dask.pydata.org/en/latest/array-overview.html#limitations Dask.array不支持任何操作,其结果形状取决于数组的值。为了形成dask图,我们必须能够在实际执行操作之前推断出数组的形状。这排除了诸如将一个dask数组索引到另一个数组或像np.where这样的操作的操作。 – achennu

相关问题