Numpy memmap дросселирует с Pytorch Dataloader, когда доступная RAM меньше размера файла - PullRequest
1 голос
/ 28 мая 2020

Я работаю над набором данных, который слишком велик для размещения в ОЗУ. Решение, которое я сейчас пытаюсь сделать, - использовать numpy memmap для загрузки одного образца / строки за раз с помощью Dataloader. Решение выглядит примерно так:

class MMDataset(torch.utils.data.Dataset):
    def __init__(self, path):
        self.file_path = path
        self.dataset_len = 44000000
        self.bytes_per_value = 32/8
        self.num_cols = 512
        self.num_rows = 1


    def __getitem__(self, index):


        x = np.memmap(self.file_path, dtype='float32', mode='r', shape=(
            self.num_rows, self.num_cols), offset=int(index*self.num_cols*self.bytes_per_value))

        return np.array(x)

    def __len__(self):
        return self.dataset_len



dataset = MMDataset('./data/emb.memmap')

data_loader = DataLoader(
    dataset,
    batch_size=4096,
    shuffle=True,
    num_workers=20
)

Когда объем доступной RAM превышает размер файла memmap, загрузка данных происходит быстро . Я получаю около 60 пакетов в секунду . Однако, когда доступная ОЗУ меньше размера файла memmap, я получаю около 3 пакетов в секунду .

Я обнаружил это, когда пробовал разные размеры для файла memmap.

Почему это так? Если Dataloader + memmap будет дросселировать, когда доступная RAM <размер файла memmap, это лишает смысла решение. размер файла memmap. Это намного больше, чем теоретический объем чтения, необходимый для загрузки пакета из 4096 выборок (ближе к 8 МБ / с). </p>

...