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

使用Python仅将HDF5文件中的一部分数据加载到内存中,python,hdf5,h5py,pytables,Python,Hdf5,H5py,Pytables,要将HDF5文件中的数据加载到内存中,可以使用pandas.read\u hdf函数和要加载的列列表。但是,通过这种方式,将整个表加载到内存中,然后删除一些列。因此,初始内存使用量远远大于数据的实际大小 有没有办法只加载感兴趣的列 Nownuri都提供读取部分文件的方法。 使用pytables,有几种方法可以将表读入numpy数组。这些措施包括: table.read()用于对数据进行切片 table.read_coordinates()读取一组[noconsecutive]坐标 (又名行)

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


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

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

  • table.read()
    用于对数据进行切片
  • table.read_coordinates()
    读取一组[noconsecutive]坐标 (又名行)
  • table.read\u where()
    根据搜索条件读取一组
它们都支持一个可选的
field='
参数,以根据字段名读取一列数据(如numpy recarry)。 有关完整的详细信息,请阅读Pytables文档。 你可以在这里找到它:

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

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

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)

你愿意用熊猫以外的东西吗?如果是这样,您可以使用pytables或h5py对numpy数组进行切片。我两者都用,更喜欢pytables。它具有更好的查询和搜索功能。h5py更像numpy,也很流行。@kcw78我可以使用h5py或pytables。其中一个是否提供只访问HDF文件的一部分的功能,而不在任何时候加载其中的所有数据?谢谢您的详细回答!当HDF文件包含numpy数组时,这些方法似乎很有用。如果文件包含熊猫数据帧,是否仍然可以读取数据帧列的子集?Nownuri我不熟悉熊猫数据帧。如果文件是以HDF5格式编写的,您应该能够使用
pytables
h5py
读取和提取数据。诀窍在于理解模式。HDF5使用组/数据集布局,其中组类似于文件夹,数据集类似于文件。数据可以是(2D)表格或各种数组格式。您可以将任何表或数组数据提取到numpy数组中。HDF组有一个用于查看HDF5数据的实用程序,称为HDFView。这是查看模式的最快方法。或者,您可以运行h5dump或ptdump。