HDF5 数据集中事件的链接
我正在尝试使用HDF5来存储时间序列的脑电图(EEG)数据。这些文件可能会非常大,并且包含很多通道,我喜欢HDF5文件格式的一些特点,比如懒加载、动态压缩、MPI等。
处理脑电图数据时,一个常见的做法是标记一些数据段为“有趣”。我在想如何把这些标记存储在文件中,但遇到了一些困难。我看到HDF5支持软链接和硬链接,可以把同一个数据集链接到其他组,但我没有找到链接到数据集某些部分的方法。
举个例子,假设我有一个叫做EEG的数据集,里面存的是睡眠数据。假设我运行了一个算法,这个算法需要一些时间来处理数据,并生成对应于快速眼动(REM)睡眠的时间段索引。我想知道在HDF5文件中存储这些索引范围的最佳方法是什么。
我现在想到的最好办法是创建一个包含三列的数据集——第一列是字符串,用来标记事件(比如“REM1”),第二列和第三列分别存储开始和结束的索引。我不太喜欢这个方案的原因是,HDF5的数据集大小是固定的。如果我后来发现某个REM睡眠的时间段标记错了,需要添加或删除这个事件,数据集的大小就得改变(而删除数据集再重新创建一个新的大小是比较麻烦的)。再加上我可能会有很多事件(想象一下标记眼睑眨动事件),这就变得更麻烦了。
我更想知道HDF5文件中是否有我不知道的功能,因为这似乎是一个很常见的需求。
1 个回答
我觉得你想要的是一个区域引用——简单来说,就是一种存储你数据某一部分的方式。在h5py中,你可以通过regionref
属性和numpy的切片语法来创建它们。如果你有一个叫ds
的数据集,还有你的REM周期的start
和end
索引,你可以这样做:
rem_ref = ds.regionref[start:end]
ds.attrs['REM1'] = rem_ref
ds[ds.attrs['REM1']] # Will be a 1-d set of values
区域引用的存储方式很自然——它们可以作为数据集的属性,或者作为组中的对象,或者你可以创建一个区域引用类型的数据集,把它们存放在里面。
在你的情况下,我可能会创建一个组(比如叫“REM_periods”之类的),然后把引用存放在里面。创建一个“REM_periods”数据集并把区域引用存放在里面也是合理的,但你可能会遇到“数据集通常不太适合变长”的问题。
把它们作为数据集的属性存储也可以,但如果你想要有多种事件类型的话,这样会变得有点麻烦。