使用 Python 仅将 HDF5 文件中的部分数据加载到内存中
Loading only a part of the data in a HDF5 file into memory with Python
要将 HDF5 文件中的数据加载到内存中,可以使用 pandas.read_hdf 函数和要加载的列列表。但是,这种方式会将整个 table 加载到内存中,然后删除一些列。因此,初始内存使用量远大于数据的实际大小。
有没有办法只加载感兴趣的列?
Nownuri,两者都提供了读取部分文件的方法。
使用 pytables
,有几种方法可以将 table 读入 numpy 数组。其中包括:
table.read()
让你切片数据,
table.read_coordinates()
读取一组[不连续]坐标
(又名行),
table.read_where()
根据搜索条件读取一组
全部支持可选的field=''
参数来读取基于字段名称的单列数据(如numpy recarry)。
有关完整的详细信息,请阅读 Pytables 文档。
您可以在这里找到它:PyTables User Guide
h5py
具有基于 numpy 数组切片约定的相似(但不同)方法。有关 h5py 的详细信息,请访问此处的文档:H5py Documentation
下面是每一个的非常简单(独立)的例子。我以写入模式创建数据,然后以读取模式重新打开文件。您可能只需要每个示例的后半部分(如何读取数据)。此外,HDF5 文件与创建方法无关:您可以使用 h5py 或 pytables 读取 HDF5 文件(与它们的创建方式无关)。
Pytables方法:
此方法显示了 2 种不同的方式来访问 table w/ 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)
要将 HDF5 文件中的数据加载到内存中,可以使用 pandas.read_hdf 函数和要加载的列列表。但是,这种方式会将整个 table 加载到内存中,然后删除一些列。因此,初始内存使用量远大于数据的实际大小。
有没有办法只加载感兴趣的列?
Nownuri,两者都提供了读取部分文件的方法。
使用 pytables
,有几种方法可以将 table 读入 numpy 数组。其中包括:
table.read()
让你切片数据,table.read_coordinates()
读取一组[不连续]坐标 (又名行),table.read_where()
根据搜索条件读取一组
全部支持可选的field=''
参数来读取基于字段名称的单列数据(如numpy recarry)。
有关完整的详细信息,请阅读 Pytables 文档。
您可以在这里找到它:PyTables User Guide
h5py
具有基于 numpy 数组切片约定的相似(但不同)方法。有关 h5py 的详细信息,请访问此处的文档:H5py Documentation
下面是每一个的非常简单(独立)的例子。我以写入模式创建数据,然后以读取模式重新打开文件。您可能只需要每个示例的后半部分(如何读取数据)。此外,HDF5 文件与创建方法无关:您可以使用 h5py 或 pytables 读取 HDF5 文件(与它们的创建方式无关)。
Pytables方法:
此方法显示了 2 种不同的方式来访问 table w/ 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)