Я работаю над набором данных, который слишком велик для размещения в ОЗУ. Решение, которое я сейчас пытаюсь сделать, - использовать 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>