2

我正在做一个 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.startself.enditertools.islice(array, start, end)islicestart

有没有更好的方法来创建这样的生成器?或者也许有更聪明的方法来使用zarrin pytorch

4

1 回答 1

1

更新:截至 2021 年 3 月,此更改已合并到 zarr。

我对 zarr 进行了深入研究,看起来这很容易从 zarr 内部启用。我在这里打开了一个问题,同时我制作了一个实现该功能的 zarr 分支array.islice(start, end)

数据集__iter__方法如下所示:

def __iter__(self):
    return self.array.islice(self.start, self.end)
于 2020-09-24T08:54:09.940 回答