gpt4 book ai didi

python - 为大型 hdf5 文件重命名组中的所有 HDF5 数据集时出现问题

转载 作者:太空狗 更新时间:2023-10-30 00:15:49 26 4
gpt4 key购买 nike

我在重命名 hdf5 中的数据集时遇到问题。这个过程非常缓慢。我阅读了一些文档,指出数据集名称只是数据的链接,因此可以接受的重命名方式是:

group['new_name'] = group['old_name']
del group['old_name']

但这太慢了(一夜之间只完成了 5%),这让我觉得我的过程是完全错误的。

我正在使用 python h5py,这是我的慢速代码:

# Open file
with h5py.File('test.hdf5') as f:

# Get all top level groups
top_keys = [key for key in f.keys()]

# Iterate over each group
for top_key in top_keys:
group = f[top_key]
tot_digits = len(group)

#Rename all datasets in the group (pad with zeros)
for key in tqdm(group.keys()):
new_key = str(key)
while len(new_key)<tot_digits:
new_key = '0'+str(new_key)
group[new_key] = group[key]
del group[key]

根据@jpp 的建议,我还尝试用 group.move 替换最后两行:

group.move(key, new_key)

但是这个方法同样慢。我有几个具有相同数量数据集的组,但每个组都有不同大小的数据集。具有最大数据集(最多字节)的组似乎重命名最慢。

当然有一种方法可以快速做到这一点。数据集名称只是一个符号链接(symbolic link)吗?还是重命名本质上会导致整个数据集被重写?我应该如何重命名 HDF5 文件中的多个数据集?

最佳答案

一个可能的罪魁祸首(至少如果您的顶级键下有大量组)是您以非常低效的方式创建新名称。而不是

while len(new_key)<tot_digits:
new_key = '0'+str(new_key)

您应该像这样生成新 key :

if len(new_key)<tot_digits:
new_key = (tot_digits-len(new_key))*'0' + new_key

这样您就不必为需要添加的每个额外数字创建一个新的字符串对象。

尽管我无法证实这一点,但也有可能调用 group.keys() 将返回一个迭代器,该迭代器将使用您添加的新键名重新填充,因为您修改了在迭代键时分组。标准的 python 迭代器会抛出 RuntimeError,但很明显 hf5py 是否会做同样的事情。为确保您没有这个问题,您可以简单地确保预先创建一个 key 列表。

for key in tqdm(list(group.keys())):

关于python - 为大型 hdf5 文件重命名组中的所有 HDF5 数据集时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53085947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com