【问题标题】:"ValueError: Not a location id (Invalid object id)" while creating HDF5 datasets创建 HDF5 数据集时出现“ValueError: Not a location id (Invalid object id)”
【发布时间】:2018-03-07 11:41:21
【问题描述】:

我有一个大小为 (3997,29) 的 numpy 数组(arr)。我正在使用这个数组来创建一个数据集。该数组具有整数和浮点变量。所以 dtype 是参考。但是当我执行它时,我得到以下错误。

"ValueError: Not a location id (Invalid object id)"

with h5py.File("test1.h5", 'w') as f:
     grp = f.create_group('Nodes')

with h5py.File("test1.h5", 'r+') as f:
     grp = f.require_group('Nodes')

ref_dtype = h5py.special_dtype(ref=h5py.Reference)

arrshape = np.shape(arr)

dset = grp.create_dataset('Init' ,arrshape, dtype = ref_dtype , data= arr)

错误发生在最后一行。以下是回溯消息
dset = f.create_dataset('Init' ,arrshape, dtype = ref_dtype , data= arr)

文件“C:\Users\rupesh.n\AppData\Local\Continuum\anaconda3\lib\site-packages\h5py_hl\group.py”,第 108 行,在 create_dataset dsid = dataset.make_new_dset(self, shape, dtype, data, **kwds)

文件“C:\Users\rupesh.n\AppData\Local\Continuum\anaconda3\lib\site-packages\h5py_hl\dataset.py”,第 137 行,在 make_new_dset dset_id = h5d.create(parent.id, None, tid, sid, dcpl=dcpl)

文件“h5py_objects.pyx”,第 54 行,在 h5py._objects.with_phil.wrapper 中

文件“h5py_objects.pyx”,第 55 行,在 h5py._objects.with_phil.wrapper 中

文件“h5py\h5d.pyx”,第 79 行,在 h5py.h5d.create 中

ValueError: Not a location id (Invalid object id)

【问题讨论】:

  • 我可以猜到错误发生在最后一行,但通常我们要求从错误中回溯来确定。另一个疯狂的猜测是当你尝试访问grpf 没有打开,而invalid object id 指的是grp。除了猜测,我们还需要minimal reproducible example
  • @Vovanrock2002,是的,错误发生在最后一行。更新了回溯消息。
  • 问题已解决。一旦我们退出循环,文件对象就被关闭了。现在解决了。

标签: python numpy object-identity


【解决方案1】:

当有人尝试使用封闭句柄创建新数据集时,经常会发生此错误。如果您正在迭代,请确保您没有在循环内关闭文件。我遇到了和 OP 一样的问题。

【讨论】:

    【解决方案2】:

    这个问题有点老了,但如果其他人在这里遇到同样的问题,我会稍微澄清一下答案。 @WilderField 是正确的,但要更清楚一点。

    在最后一行:

    dset = grp.create_dataset('Init' ,arrshape, dtype = ref_dtype , data= arr)

    grp 指向 已关闭 h5py.Group 用于:

    with h5py.File("test1.h5", 'r+') as f:
         grp = f.require_group('Nodes')
    

    因为grp 被设置为指向with... 上下文管理器中的组,所以grp 只是该上下文管理器中的一个开放组。当上下文管理器退出时,HDF 和与 HDF 关联的所有组/数据集都将关闭。这种行为是为了防止 HDF 被丢失的指向 HDF 对象的指针保持打开状态。

    解决方案是在上下文管理器内部创建h5py.Dataset,即:

    with h5py.File("test1.h5", 'r+') as f:
         grp = f.require_group('Nodes')
         dset = grp.create_dataset('Init' ,arrshape, dtype = ref_dtype , data= arr)
    

    同样,一旦上下文管理器关闭,dset 将指向一个 Closed h5py.Dataset,所以除非你真的想用它做更多的事情,否则调用 @ 就足够了987654332@ 没有将返回分配给dset

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多