Неполная проблема с отображением памяти - PullRequest
0 голосов
/ 08 октября 2018

Я недавно работал с большими матрицами.Мои входные данные хранятся в виде файлов размером 15 ГБ .npz, которые я пытаюсь читать постепенно, небольшими партиями.

Я знаком с отображением памяти, и, увидев, numpy также поддерживает подобные операцииказалось идеальным решением.Однако проблема, с которой я сталкиваюсь, заключается в следующем:

Сначала я загружаю матрицу с помощью:

foo = np.load('matrix.npz',mmap_mode="r+")

foo имеет один ключ: data.

Когда я пытаюсь, например, сделать:

foo['data'][1][1]

numpy, кажется, бесконечно тратит доступную оперативную память, почти как если бы не было сопоставления памяти.Я что-то не так делаю?

Моей целью было бы, например, прочитать 30 строк за раз:

for x in np.arange(0,matrix.shape[1],30):
    batch = matrix[x:(x+30),:]
    do_something_with(batch)

Спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

Я думаю, что mmap_mode="r+" игнорируется, если рассматриваемый файл представляет собой сжатый файл.Я не использовал NumPy таким образом, поэтому некоторые из моих следующих предположений - мое лучшее предположение.Документация для load состояний

Если файл представляет собой файл .npz, то возвращается словарь-объект, содержащий пары {имя_файла: массив} ключ-значение, одиндля каждого файла в архиве.

Нет упоминания о том, что он делает с mmap_mode.Однако в коде для загрузки файлов .npz не используется ключевое слово mmap_mode:

    if magic.startswith(_ZIP_PREFIX):
        # zip-file (assume .npz)
        # Transfer file ownership to NpzFile
        tmp = own_fid
        own_fid = False
        return NpzFile(fid, own_fid=tmp, allow_pickle=allow_pickle, pickle_kwargs=pickle_kwargs)

Итак, ваше первоначальное предположение действительно верно.Numpy использует все оперативной памяти, потому что не происходит меммэппинга.Это ограничение реализации load;поскольку формат npz представляет собой несжатый zip-архив, должна быть возможность запоминать переменные (если, конечно, ваши файлы не были созданы с savez_compressed).

Реализация функции загрузки, которая memmaps npz будет довольно сложной работой, поэтому вы можете взглянуть на структурированные массивы .Они обеспечивают аналогичное использование (доступ к полям по ключам) и уже совместимы с memmapping.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...