学习笔记:pytables与HDF5的部分相关学习

本篇pytables相关内容是学习pytables官方网站而得!(如有侵权,请联系本人删除)
PyTables是一个用于管理分层数据集的包,旨在高效、轻松地处理极其大量的数据。PyTables是在HDF5库的基础上构建的,使用Python语言和NumPy包。它的特点是一个面向对象的接口,结合对代码的性能关键部分(使用 Cython 生成)的 C 扩展,使其成为一个快速且非常容易使用的工具,用于交互式浏览、处理和搜索大量数据。PyTables的一个重要特性是,它优化内存和磁盘资源,使数据占用的空间非常少。

HDF5(英文详细介绍)

HDF5 是一个全新的分层数据格式产品,由数据格式规范和支持库实现组成。HDF5 旨在解决旧 HDF 产品的一些限制,并满足现代系统和应用程序的当前和预期要求。
限制:

  • 单个文件不能存储超过 20,000 个复杂对象,单个文件不能大于 2 GB。
  • 数据模型没有达到应有的一致性,对象类型过多,数据类型受到限制。
  • 库源陈旧且过于复杂,不能有效地支持并行 I/O,并且难以在线程应用程序中使用。

HDF5的改进:

  • 一种新的文件格式,旨在解决 HDF4.x 的一些缺陷,特别是需要存储更大的文件和每个文件更多的对象。
  • 一个更简单、更全面的数据模型,仅包含两个基本结构:记录结构的多维数组和分组结构。
  • 一个更简单、设计更好的库和 API,改进了对并行 I/O、线程和现代系统和应用程序强加的其他要求的支持。

HDF5 文件以分层结构组织,具有两个主要结构:组和数据集。

:包含零个或多个组或数据集的实例以及支持元数据(Metadata,为描述数据的数据(data about data)主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能)的分组结构,一个组通常包括两部分;

  1. 一个组的标题包括一个组名和一个组属性列表;
  2. 一个组符号表,属于组的HDF5对象列表;

数据集:数据元素的多维数组,以及支持的元数据,分成两部分存储在文件中:标题和数据数组。标题包含解释数据集的数组部分所需信息,以及描述或注释数据集的元数据,数据数组一般包括四部分基本信息:数据集名称,数据类型,数据空间(描述数据集的维度)和存储布局(默认的存储布局格式是contiguous)。

pytables(tables)

1.h5文件的编写与读取(tables.File函数)

 tables.File(filename, mode='r', title='', root_uep='/', filters=None, **kwargs) #读取h5文件

filename:是h5的文件名;
mode:是对h5文件进行的操作,‘r’表示读取h5文件不改变数据;‘w’表示创建新的h5文件并删除相同名称的文件;‘a’打开h5文件进行读取和修改,如果文件不存在则创建;‘r+’与‘a’一样,但是要求文件必须存在;
title:如果要创建文件,将在根组上设置一个TITLE字符串属性,该属性具有给定的值。否则,标题将从磁盘读取,这将没有任何影响;
root_uep:HDF5层次结构中的一个组,将作为创建对象树的起点。它可以是文件中任何现有的组,以其HDF5路径命名。如果不存在,则发出一个HDF5ExtError;
filter:提供了适用于直接从根组挂起的叶子的所需I/O过滤器的信息,除非为这些叶子指定了其他过滤器属性。此外,如果没有为子组指定过滤器属性,它们将继承这些属性,这些属性将反过来传播到子节点;

2.过滤器的设置(tables.Filters函数)

tables.Filters(complevel=0, complib='zlib', shuffle=True, bitshuffle=False, fletcher32=False,
 			   least_significant_digit=None, _new=True)  #设置过滤器

complevel:指定数据的压缩级别,取值范围是0 ~ 9,值为0(默认值)将禁用压缩;
complib:指定使用的压缩库,目前支持’ zlib ‘(默认)、’ lzo ‘、’ bzip2 ‘和’ blosc ‘。其他用于Blosc的压缩器,如’ Blosc: zclz ‘(如果没有指定额外的压缩器,’ bloclz '是默认值),指定一个在系统中不可用的压缩库会发出一个FiltersWarning,并将该库设置为默认值;
shuffle:是否使用HDF5库中的Shuffle过滤器,这通常用于提高压缩比,False禁用shuffle,True启用。默认值取决于是否启用压缩;如果启用压缩,则默认启用shuffle,否则禁用shuffle。shuffle只能在启用压缩时使用;
bitshuffle:是否使用‘blosc’库中Bitshuffle过滤器,也常用于提高压缩比,False禁用,True启用,默认值为False;
fletcher32:是否使用HDF5库中的Fletcher32过滤器,该值用于在每个数据块上添加校验和(传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据)。如果值为false(默认值),则禁用校验和;
least_significant_digit(int):如果指定,数据将被量化。与启用压缩相结合,这将产生“有损”,但明显更有效的压缩。例如,如果least_significant_digit=1,将使用around(scale*data)/scale对数据进行量化,其中scale = 2**位(2的指数次方),并且确定位以便保留0.1的精度(在本例中bits=4,32位)。默认值为None,或不进行量化;只有启用了某种形式的压缩时,才会应用量化

3.定义存储在数据集中的原子单元格的类型(tables.Atom函数)

tables.Atom(itemsize, shape, dflt)

itemsize:对于具有非固定大小的类型,这将以字节为单位设置原子单元中各个项的大小;
shape:设置原子单元的形状。N的整数形状等价于元组(N,);
dflt:为原子单元设置默认值,如果用户在填充数据集时没有为元素提供值,则该默认值将被写入磁盘。如果用户为多维原子提供标量值,则该值将自动传播到原子单元中的所有项。如果没有提供dflt,默认情况下将选择适当的零值(或空字符串)。请注意,默认值在内部保存为NumPy对象;

4.创建数组(File.create_array函数)

File.create_array(where, name, obj=None, title='', byteorder=None, createparents=False, 
				  atom=None, shape=None, track_times=True)

where:新数组添加到的父组,可以是Group实例也可以是具体路径;
name:新数组名字;
obj (python object):要保存的数组或标量。可接受的类型是NumPy数组和标量,以及原生Python序列和标量,前提是值是规则的(即它们不像[[1,2],2])和同类的(即所有元素都是同一类型的),不支持某些维度等于0的对象;
title(str, optional):节点的描述,在磁盘上设置TITLE HDF5属性;
byteorder(str, optional):磁盘上数据的字节顺序,指定为’ little ‘或’ big ',如果没有指定,字节顺序应该为给定对象的字节顺序;
createparents (bool, optional): 是否为父路径的存在创建所需的组,默认情况下不做;
atom:表示要保存原子对象的类型和形状;
shape:存储矩阵的形状;
track_times:是否记录与叶子相关的时间数据(对象访问时间、原始数据修改时间、元数据更改时间、对象生成时间),默认为True。这些时间的语义取决于它们在HDF5库中的实现,只执行ctime(元数据更改时间);

5.创建一个新的分块数组(File.create_carray函数)

File.create_carray(where, name, atom=None, shape=None, title='', filters=None, chunkshape=None,
				   byteorder=None, createparents=False, obj=None, track_times=True)

where:新数组添加到的父组,可以是Group实例也可以是具体路径;
name:新数组名字;
atom:表示要保存原子对象的类型和形状,3.0版更改,如果提供obj,该参数可设为默认值None;
shape:新的数组形状,有且必仅有一个形状尺寸为0以保证数组可以沿着它扩展,3.0版更改,如果提供obj,该参数可设为默认值None;
title(str, optional):节点的描述,在磁盘上设置TITLE HDF5属性;
filters :Filter类的一个实例,提供了适用于直接从这个新数组挂起的叶子的所需I/O过滤器的信息;
chunkshape(tuple, numeric, or None, optional):在一次HDF5 I/O操作中要读或写的数据块的形状,过滤器应用于这些数据块,维度应该与shape保持一致,如果为None,则根据expectedrows参数计算一个合理的值;
byteorder(str, optional):磁盘上数据的字节顺序,指定为’ little ‘或’ big ',如果没有指定,字节顺序应该为platform顺序;
createparents (bool, optional): 是否为父路径的存在创建所需的组,默认情况下不做;
obj (python object):要保存的数组或标量。可接受的类型是NumPy数组和标量,以及原生Python序列和标量,前提是值是规则的(即它们不像[[1,2],2])和同类的(即所有元素都是同一类型的)。obj参数是可选的,它可以作为atomshape的替代提供。如果objatomshape都被提供,它们必须彼此一致;
track_times:是否记录与叶子相关的时间数据(对象访问时间、原始数据修改时间、元数据更改时间、对象生成时间),默认为True。这些时间的语义取决于它们在HDF5库中的实现,只执行ctime(元数据更改时间);

6.创建一个新的可扩充数组(File.create_earray函数)

File.create_earray(where, name, atom=None, shape=None, title='', filters=None, expectedrows=1000,
				   chunkshape=None, byteorder=None, createparents=False, obj=None, track_times=True)

where:新数组添加到的父组,可以是Group实例也可以是具体路径;
name:新数组名字;
atom:表示要保存原子对象的类型和形状,3.0版更改,如果提供obj,该参数可设为默认值None;
shape:新的数组形状,有且必仅有一个形状尺寸为0以保证数组可以沿着它扩展,3.0版更改,如果提供obj,该参数可设为默认值None;
title(str, optional):节点的描述,在磁盘上设置TITLE HDF5属性;
filters :Filter类的一个实例,提供了适用于直接从这个新数组挂起的叶子的所需I/O过滤器的信息;
expectedrows(int, optional):用户估计将添加到array节点中可增长维度的行元素的数量,如果为设置,默认为EXPECTED_ROWS_EARRAY(1000);
chunkshape(tuple, numeric, or None, optional):在一次HDF5 I/O操作中要读或写的数据块的形状,过滤器应用于这些数据块,维度应该与shape保持一致,如果为None,则根据expectedrows参数计算一个合理的值;
byteorder(str, optional):磁盘上数据的字节顺序,指定为’ little ‘或’ big ',如果没有指定,字节顺序应该为platform顺序;
createparents (bool, optional): 是否为父路径的存在创建所需的组,默认情况下不做;
obj (python object):要保存的数组或标量。可接受的类型是NumPy数组和标量,以及原生Python序列和标量,前提是值是规则的(即它们不像[[1,2],2])和同类的(即所有元素都是同一类型的)。obj参数是可选的,它可以作为atomshape的替代提供。如果objatomshape都被提供,它们必须彼此一致;
track_times:是否记录与叶子相关的时间数据(对象访问时间、原始数据修改时间、元数据更改时间、对象生成时间),默认为True。这些时间的语义取决于它们在HDF5库中的实现,只执行ctime(元数据更改时间);

7.创建新的组(File.create_group函数

File.create_group(where, name, title='', filters=None, createparents=False)

where:新组添加到的父组,可以是Group实例也可以是具体路径;
name:新组名字;
title (str, optional):节点的描述,在磁盘上设置TITLE HDF5属性;
filters:Filters的一个实例,它提供了适用于直接从这个新组挂起的叶子的所需I/O过滤器的信息(除非为这些叶子指定了其他过滤器属性)。此外,如果没有为其子组指定filter属性,它们将继承这些属性;
createparents :是否为父路径的存在创建所需的组,默认情况下不做;

猜你喜欢

转载自blog.csdn.net/qq_53312564/article/details/122455998