我有一个 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__
函数内部发生。
关于python - h5py - HDF5 数据库随机返回 NaN 和具有多个读者的非常小的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045512/