在 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 中存储可变长度字符串列表的标准方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
通过 h5py (HDF5) 写入具有可变长度字符串的复合数据集
如何读取值为可变长度 char* 数组的 HDF5 标量属性(即 c_strings?)
如何使用可变长度类型将包含多个 std::vector<float> 的结构写出到 HDF5?