【问题标题】:h5py: slicing dataset without loading into memoryh5py:切片数据集而不加载到内存中
【发布时间】:2014-09-11 04:05:08
【问题描述】:

是否可以将 h5py 数据集分成两个子集而不实际将它们加载到内存中?例如:

dset = h5py.File("/2tbhd/tst.h5py","r")

X_train = dset['X'][:N/2]
X_test  = dset['X'][N/2:-1]

【问题讨论】:

  • 您发布的代码有什么问题?
  • 他发布的代码会立即将这些数据点加载到内存中。他想传递对他数据的两半的两个引用,而不传递大数组。
  • 我不知道怎么做。起初我认为区域引用可能是您需要的,但据我所知,这不是答案。
  • 现在我记得 h5py 邮件列表上的这个旧线程:groups.google.com/d/msg/h5py/9WKEiIIBBR8/lbaXCZ7WQFYJ
  • @JohnZwinck,正如 superbatfish 所说,这段代码会立即将数据加载到内存中。

标签: python numpy h5py


【解决方案1】:

没有。

您需要实现自己的类来充当数据集的视图。 h5py 邮件列表中的An old thread 表明这样的DatasetView 类理论上可以使用HDF5 数据空间来实现,但对于许多用例来说可能不值得。与普通的 numpy 数组相比,逐元素访问会非常慢(假设您可以将数据放入内存中)。

编辑:如果您想避免弄乱 HDF5 数据空间(无论这意味着什么),您可能会选择一种更简单的方法。试试this gist 我刚刚写的。像这样使用它:

dset = h5py.File("/2tbhd/tst.h5py","r")

from simpleview import SimpleView
X_view = SimpleView(dset['X'])

# Stores slices, but doesn't load into memory
X_train = X_view[:N/2]
X_test  = X_view[N/2:-1]

# These statements will load the data into memory.
print numpy.sum(X_train)
print numpy.array(X_test)[0]

请注意,这个简单示例中的切片支持有些有限。如果你想要完全切片和元素访问,你必须将它复制到一个真实的数组中:

X_train_copy = numpy.array(X_train)

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多