我正在做一个 pytorch 项目,我的数据保存在zarr
.
随机访问zarr
代价高昂,但由于zarr
使用了块缓存,迭代非常快。为了利用这一事实,我将 anIterableDataset
与多个工人一起使用:
class Data(IterableDataset):
def __init__(self, path, start=None, end=None):
super(Data, self).__init__()
store = zarr.DirectoryStore(path)
self.array = zarr.open(store, mode='r')
if start is None:
start = 0
if end is None:
end = self.array.shape[0]
assert end > start
self.start = start
self.end = end
def __iter__(self):
return islice(self.array, self.start, self.end)
问题在于,self.array
对于行的顺序和10e9
连续的工作人员,随着自然地变大,创建生成器需要花费我的训练/验证过程的大量时间,因为仍然必须迭代不需要的元素直到它到达. 一旦为每个工人创建了一个生成器,这就像一个魅力,但要到达那里需要太长时间。self.start
self.end
itertools.islice(array, start, end)
islice
start
有没有更好的方法来创建这样的生成器?或者也许有更聪明的方法来使用zarr
in pytorch
?