添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

用Python仅将HDF5文件中的部分数据加载到内存中

2 人关注

要将HDF5文件中的数据加载到内存中,可以使用pandas.read_hdf函数,并列出要加载的列。然而,这样一来,整个表就被加载到了内存中,然后一些列被丢弃。因此,最初的内存使用量要比数据的实际大小大得多。

有没有一种方法可以只加载感兴趣的列?

2 个评论
你愿意使用pandas以外的东西吗?如果是这样,你可以使用pytables或h5py来切分numpy数组。我两者都用,而且更喜欢pytables。它有更好的查询和搜索功能。h5py更像numpy,而且也很流行。
@kcw78 我可以使用h5py或pytables。其中是否有一个功能可以只访问HDF文件的一部分,而不在任何时候加载其中的所有数据?
python
hdf5
h5py
pytables
Nownuri
Nownuri
发布于 2019-08-04
1 个回答
kcw78
kcw78
发布于 2019-08-04
已采纳
0 人赞同

Nownuri,两者都提供了读取部分文件的方法。
通过 pytables ,有几种方法可以将表读入numpy数组。这些方法包括。

  • table.read() lets you slice the data,
  • table.read_coordinates() reads a set [noconsecutive] coordinates (aka rows),
  • table.read_where() read a set of based on a search condition
  • 都支持一个可选的 field='' 参数,用来读取基于字段名的单列数据(像numpy recarry)。 关于完整的细节,请阅读Pytables文档。 你可以在这里找到它。 PyTables用户指南

    h5py 有类似的(但不同的)方法,基于numpy数组切片的惯例。关于h5py的细节,请访问这里的文档。 H5py 文档

    下面是每个人的非常简单(自成一体)的例子。我以写模式创建数据,然后以读模式重新打开文件。你可能只需要每个例子的后半部分(如何读取数据)。另外HDF5文件与创建方法无关:你可以用h5py或pytables读取任何一个HDF5文件(与它们的创建方式无关)。

    Pytables方法。
    这个方法展示了用pytables访问表的两种不同方式。第一种使用 "自然命名 "来获取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 method:

    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: