Skip to main content
 首页 » 编程设计

python之h5py之HDF5 数据库随机返回 NaN 和具有多个读者的非常小的数据

2025年05月04日14exmyth

我有一个 HDF5 数据集,我正在使用一个框架来创建多个进程来读取它(PyTorch 的 DataLoader,但这个框架应该不重要)。我正在随机索引 3D float 组的第一个维度,为了调试发生的事情,我一直在对索引中的切片求和。每隔一段时间,总和切片就会变成 nan 或一个非常小的值(一个不应该出现在我的数据中的值)。如果我连续两次执行相同的索引,那么另一次的值是正确的(第一个或第二个索引可能会出错)。例如,下面是我在索引过程中得到的一些值,其中左边应该与右边匹配,但有时值会出错:

21.2162 21.2162 
89.9759 6.5469e-33 
35.7114 35.7114 
35.2934 35.2934 
56.8512 56.8512 
42.2215 42.2215 
11.5307 nan 
19.2904 19.2904 
25.4261 25.4261 

这来自于一个接一个地索引:

print(dataset[index].sum(), end=' ') 
print(dataset[index].sum()) 

当我只使用一个进程来索引数据集时,问题似乎没有出现。数据集仅被读取(无写入)。有谁知道为什么会发生这种情况以及是否有办法阻止这种情况?

请您参考如下方法:

我遇到了同样的问题,在花了一天时间尝试通过 h5py 将 PyTorch DataParallel 加载器包装器与 HDF5 结合之后,我发现在新进程中打开 h5py.File 至关重要,而不是在主进程中打开它并希望它被底层多处理实现继承。

由于 PyTorch 似乎采用惰性方式来初始化 worker,这意味着实际的文件打开必须在 Dataset 包装器的 __getitem__ 函数内部发生。