【问题标题】:Loading only a part of the data in a HDF5 file into memory with Python使用 Python 仅将 HDF5 文件中的部分数据加载到内存中
【发布时间】:2019-12-12 01:14:50
【问题描述】:

要将 HDF5 文件中的数据加载到内存中,可以使用 pandas.read_hdf 函数和要加载的列列表。但是,这种方式将整个表加载到内存中,然后删除一些列。因此,初始内存使用量远大于数据的实际大小。

有没有办法只加载感兴趣的列?

【问题讨论】:

  • 你愿意用除了pandas之外的东西吗?如果是这样,您可以使用 pytables 或 h5py 对 numpy 数组进行切片。我两者都用,而且更喜欢 pytables。它具有更好的查询和搜索功能。 h5py 更像 numpy,也很受欢迎。
  • @kcw78 我可以使用 h5py 或 pytables。其中之一是否会提供仅访问 HDF 文件的一部分而不在任何时候加载其中的所有数据的功能?

标签: python hdf5 h5py pytables


【解决方案1】:

Nownuri,两者都提供读取部分文件的方法。
使用pytables,有几种方法可以将表读入 numpy 数组。其中包括:

  • table.read() 可让您对数据进行切片,
  • table.read_coordinates() 读取一组 [noconsecutive] 坐标 (又名行),
  • table.read_where()根据搜索条件读取一组

所有都支持可选的field='' 参数来根据字段名称读取单列数据(如numpy recarry)。 有关完整的详细信息,请阅读 Pytables 文档。 你可以在这里找到它:PyTables User Guide

h5py 具有基于 numpy 数组切片约定的相似(但不同)方法。有关 h5py 的详细信息,请访问此处的文档:H5py Documentation

下面是每个非常简单(自包含)的示例。我以写入模式创建数据,然后以读取模式重新打开文件。您可能只需要每个示例的后半部分(如何读取数据)。 HDF5 文件也独立于创建方法:您可以使用 h5py 或 pytables 读取 HDF5 文件(独立于它们的创建方式)。

Pytables 方法:
此方法显示了 2 种不同的方式来访问带有 pytables 的表。第一个使用'Natural Naming'获取h5_i_arr,第二个使用get_node()方法读取h5_x_arr

import tables as tb
import numpy as np

with tb.File('SO_57342918_tb.h5','w') as h5f:

    i_arr=np.arange(10)
    x_arr=np.arange(10.0)

    my_dt = np.dtype([ ('i_arr', int), ('x_arr', float) ] )
    table_arr = np.recarray( (10,), dtype=my_dt )
    table_arr['i_arr'] = i_arr
    table_arr['x_arr'] = x_arr

    my_ds = h5f.create_table('/','ds1',obj=table_arr)

# read 1 column using field= parameter:   
with tb.File('SO_57342918_tb.h5','r') as h5f:

    h5_i_arr = h5f.root.ds1.read(field='i_arr')
    h5_x_arr = h5f.get_node('/ds1').read(field='x_arr')
    print (h5_i_arr)
    print (h5_x_arr)

h5py 方法:

import h5py
import numpy as np

with h5py.File('SO_57342918_h5py.h5','w') as h5f:

    i_arr=np.arange(10)
    x_arr=np.arange(10.0)

    my_dt = np.dtype([ ('i_arr', int), ('x_arr', float) ] )
    table_arr = np.recarray( (10,), dtype=my_dt )
    table_arr['i_arr'] = i_arr
    table_arr['x_arr'] = x_arr

    my_ds = h5f.create_dataset('/ds1',data=table_arr)

# read 1 column using numpy slicing: 
with h5py.File('SO_57342918_h5py.h5','r') as h5f:

    h5_i_arr = h5f['ds1'][:,'i_arr']
    h5_x_arr = h5f['ds1'][:,'x_arr']
    print (h5_i_arr)
    print (h5_x_arr)

【讨论】:

  • 感谢您的详细解答!当 HDF 文件包含 numpy 数组时,这些方法似乎很有用。如果文件包含 pandas 数据框,是否仍然可以读取数据框列的子集?
  • Nownuri 我不熟悉 Pandas 数据框。如果文件以 HDF5 格式写入,您应该能够使用pytablesh5py 读取和提取数据。诀窍是理解架构。 HDF5 使用组/数据集布局,其中组就像文件夹,数据集是文件。数据可以是(2D)表格或各种数组格式。您可以将任何表或数组数据提取到 numpy 数组中。 HDF Group 有一个查看 HDF5 数据的实用程序。它被称为 HDFView。这是查看架构的最快方式。或者,您可以运行 h5dump 或 ptdump。
  • @kcw78:太棒了!你的答案正是我想要的!谢谢!
猜你喜欢
  • 2019-07-04
  • 2018-02-22
  • 2021-06-20
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
相关资源
最近更新 更多