【问题标题】:How to copy a dataset object to a different hdf5 file using pytables or h5py?如何使用 pytables 或 h5py 将数据集对象复制到不同的 hdf5 文件?
【发布时间】:2019-04-26 14:22:24
【问题描述】:

我选择了特定的 hdf5 数据集并希望将它们复制到新的 hdf5 文件中。我可以找到一些关于在两个文件之间复制的教程,但是如果您刚刚创建了一个新文件并且想要将数据集复制到该文件中怎么办?我认为下面的方法会起作用,但事实并非如此。有什么简单的方法可以做到这一点?

>>> dic_oldDataset['old_dataset']
<HDF5 dataset "old_dataset": shape (333217,), type "|V14">

>>> new_file = h5py.File('new_file.h5', 'a')
>>> new_file.create_group('new_group')

>>> new_file['new_group']['new_dataset'] = dic_oldDataset['old_dataset']


RuntimeError: Unable to create link (interfile hard links are not allowed)

【问题讨论】:

  • new_file['new_group'].create_dataset('name', data=dic_oldDataset['old_dataset'][:]。换句话说,在组中创建一个新的dataset,并用旧数据集或从旧数据集加载的数组填充它。 [:] 将数据集加载到数组中;我必须测试一下是否真的需要它。

标签: python hdf5 h5py pytables


【解决方案1】:

答案 1(使用 h5py):
这将创建一个简单的结构化数组来填充第一个文件中的第一个数据集。 然后从该数据集中读取数据并使用my_array 复制到第二个文件。

import h5py, numpy as np

arr = np.array([(1,'a'), (2,'b')], 
      dtype=[('foo', int), ('bar', 'S1')]) 
print (arr.dtype)

h5file1 = h5py.File('test1.h5', 'w')
h5file1.create_dataset('/ex_group1/ex_ds1', data=arr)                
print (h5file1)

my_array=h5file1['/ex_group1/ex_ds1']

h5file2 = h5py.File('test2.h5', 'w')
h5file2.create_dataset('/exgroup2/ex_ds2', data=my_array)
print (h5file2)

h5file1.close()
h5file2.close()

【讨论】:

    【解决方案2】:

    答案 3

    使用来自h5pygroup 类的copy 方法。

    TL;DR

    这适用于组和数据集。 是递归的(可以做深拷贝和浅拷贝)。 具有属性、符号链接和引用选项。

    with h5py.File('destFile.h5','w') as f_dest:
        with h5py.File('srcFile.h5','r') as f_src:
                f_src.copy(f_src["/path/to/DataSet"],f_dest["/another/path"],"DataSet")
    

    (文件对象也是根组。)

    HDF5 中的位置

    “一个 HDF5 文件被组织为一个根目录,directed graph”(source)。 HDF5 组(包括根组)和数据集作为“位置”相互关联(在C API 中,大多数函数采用loc_id 标识组或数据集)。这些位置是图上的节点,路径描述了通过图到节点的弧线。 copy 采用源和目标位置,而不是特定的组或数据集,因此它可以应用于两者。源和目标不需要在同一个文件中。

    属性

    属性存储在与其关联的组或数据集的标题中。因此,属性也与那个“位置”相关联。因此,复制组或数据集将包含与该“位置”相关的所有属性。但是你可以关闭它。

    参考文献

    copy 提供引用设置,也称为对象指针。对象指针是hdf5中的一种数据类型:H5T_STD_REG_OBJ,类似于整数H5T_STD_I32BEsource),可以存储在属性或数据集中。引用可以指向数据集中的整个对象或区域。 copy 似乎只涵盖对象引用。 它是否与数据集区域 H5T_STD_REF_DSETREG 中断?

    符号链接

    C api 采用的“位置”是一个抽象级别,它解释了为什么copy 函数适用于单个数据集。再看图,标注的是边,而不是节点。在底层,HDF5 对象是链接的目标,每个链接(边)都有名称,对象(节点)没有名称。有两种类型的链接:硬链接和符号链接。所有 HDF5 对象必须至少有一个硬链接,硬链接只能针对其文件中的对象。创建硬链接时,引用计数增加一,符号链接不影响引用计数。符号链接可能指向文件中的对象(软)或其他文件中的对象(外部)。 copy 提供扩展软链接和外部符号链接的选项。

    这解释了错误代码(如下),并提供了复制数据集的替代方法;软链接可以允许访问另一个文件中的数据集。

    RuntimeError: Unable to create link (interfile hard links are not allowed)
    

    【讨论】:

      【解决方案3】:

      答案 2(使用 pytables):
      这遵循与上述 pytables 函数相同的过程。它创建相同的简单结构化数组来填充第一个文件中的第一个数据集。然后从该数据集中读取数据并使用my_array 复制到第二个文件。

      import tables, numpy as np
      
      arr = np.array([(1,'a'), (2,'b')], 
            dtype=[('foo', int), ('bar', 'S1')]) 
      print (arr.dtype)
      h5file1 = tables.open_file('test1.h5', mode = 'w', title = 'Test file')
      my_group = h5file1.create_group('/', 'ex_group1', 'Example Group')
      my_table = h5file1.create_table(my_group, 'ex_ds1', None, 'Example dataset', obj=arr)                
      print (h5file1)
      
      my_array=my_table.read()
      
      h5file2 = tables.open_file('test2.h5', mode = 'w', title = 'Test file')
      h5file2.create_table('/exgroup2', 'ex_ds2', createparents=True, obj=my_array)
      print (h5file2)
      
      h5file1.close()
      h5file2.close()
      

      【讨论】:

        猜你喜欢
        • 2018-04-14
        • 2016-03-29
        • 2015-10-29
        • 2012-05-03
        • 2015-04-17
        • 2016-03-23
        • 2022-11-14
        • 2015-09-17
        • 2016-04-04
        相关资源
        最近更新 更多