在 hdf5 中存储可变长度字符串列表的标准方法是啥?

Posted

技术标签:

【中文标题】在 hdf5 中存储可变长度字符串列表的标准方法是啥?【英文标题】:What is the standard way to store a list of variable length string in hdf5?在 hdf5 中存储可变长度字符串列表的标准方法是什么? 【发布时间】:2021-09-06 14:37:55 【问题描述】:

假设我希望事情是自动的和默认的,我可以做这样的事情。

with h5py.File('store_str_2.hdf5','w') as hf: 
     variable_length_str = ['abcd', 'bce', 'cd']
     hf.create_dataset('variable_length_str', data=variable_length_str) 

但是在互联网上,我可以找到类似的解决方案:

with h5py.File('store_str.hdf5','w') as hf: 
     dt = h5py.special_dtype(vlen=str) 
     variable_length_str = np.array(['abcd', 'bce', 'cd'], dtype=dt) 
     hf.create_dataset('variable_length_str', data=variable_length_str)

那么这两者有什么区别呢?为什么不只使用简单的存储可变长度字符串列表呢?它会导致一些后果,例如占用更多空间等吗?

另一个问题是如果我想节省空间(通过压缩),将字符串列表存储在 hdf5 中的更好方法是什么?

【问题讨论】:

【参考方案1】:

Q1:两者有什么区别?

h5py 旨在使用 NumPy 数组来保存 HDF5 数据。因此,典型的行为是固定长度的字符串(例如S10)。您找到的 dtype 是支持可变长度字符串的较旧的 h5py 实现。当前实现使用h5py.string_dtype(encoding= , length=)length=None 用于可变长度字符串。注意:同样的限制适用于具有关联的可变长度(又名“不规则”)数组。

Q2:为什么不使用简单的存储可变长度字符串列表? Q3:会不会造成占用更多空间等后果?

您可以使用简单的字符串 dtype,但所有保存的字符串将具有相同的长度。您必须分配保存要保存的最长字符串 - 较短的字符串将用空格填充。

有关详细信息,请参阅此处的 h5py 文档: h5py: Variable-length strings

请注意,该 API 在 h5py 2.10 中进行了更新。此处记录了较旧的 API:h5py: Older vlength API

【讨论】:

以上是关于在 hdf5 中存储可变长度字符串列表的标准方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 Python 将字符串列表存储到 HDF5 数据集

通过 h5py (HDF5) 写入具有可变长度字符串的复合数据集

如何读取值为可变长度 char* 数组的 HDF5 标量属性(即 c_strings?)

如何使用可变长度类型将包含多个 std::vector<float> 的结构写出到 HDF5?

使用 Java Native Library 在 HDF5 中编写交错数组

如何在 HDF5 中编写固定长度的字符串?