【问题标题】:how can I save super large array into many small files?如何将超大数组保存到许多小文件中?
【发布时间】:2017-01-24 20:17:42
【问题描述】:

在 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

【问题讨论】:

  • 您可以使用numpy.memmap 数组,它使用磁盘而不是内存。 Check this Example
  • 能否将多个文件映射到一个数组中?
  • 我知道memmap 可以将多个数组映射到一个文件中,但从未尝试使用多个文件来映射一个数组。使用默认的memmap 类可能无法做到这一点

标签: python numpy filesystems hdf5 pytables


【解决方案1】:

我会使用 hdf5。在 h5py 中,您可以指定一个块大小,这样可以有效地检索数组的小块:

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

【讨论】:

  • 链接不是关于单个 hdf5 文件中的多个数据集吗?我希望能够将许多不同文件中的数据集作为一个单独的文件查看。你能告诉我在哪里可以找到这些信息吗?
  • 我建议将整个阵列放入单个 HDF5 文件中。然后,HDF5 会将数据分块到磁盘空间的小块中,这样您就可以有效地访问核心外的阵列。除非您受到某种限制,即生成数组的系统已经在写入许多小文件。
  • 好吧,一个大文件不是一个选项。它需要在许多小文件中。我想避免复制 TB 级数据。
【解决方案2】:

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

【讨论】:

  • 虽然一开始这是一个很好的建议,但由于一个相当重要的限制,我不相信这样做:dask 数组不能被其他数组索引。请参阅dask.pydata.org/en/latest/array-overview.html#limitations Dask.array 不支持结果形状取决于数组值的任何操作。为了形成 dask 图,我们必须能够在实际执行操作之前推断出数组的形状。这排除了诸如用另一个索引一个 dask 数组或诸如 np.where 之类的操作之类的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多