numpy.memmap#

класс numpy.memmap(filename, dtype= 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')[источник]#

Создать отображение памяти на массив, хранящийся в бинарный файл на диске.

Файлы, отображаемые в память, используются для доступа к небольшим сегментам больших файлов на диске без загрузки всего файла в память. Memmap в NumPy — это объекты, подобные массивам. Это отличается от mmap модуль, который использует объекты, подобные файлам.

Этот подкласс ndarray имеет некоторые неприятные взаимодействия с некоторыми операциями, потому что он не совсем правильно подходит как подкласс. Альтернативой использованию этого подкласса является создание mmap объект самостоятельно, затем создайте ndarray с помощью ndarray.__new__ напрямую, передавая созданный объект в параметр 'buffer='.

Этот класс может в какой-то момент быть преобразован в фабричную функцию, которая возвращает представление в буфере mmap.

Сбросьте экземпляр memmap, чтобы записать изменения в файл. В настоящее время нет API для закрытия базового mmap. Сложно гарантировать, что ресурс действительно закрыт, поскольку он может быть общим для разных экземпляров memmap.

Параметры:
filenamestr, файлоподобный объект или экземпляр pathlib.Path

Имя файла или файловый объект, используемый в качестве буфера данных массива.

dtypeтип данных, опционально

Тип данных, используемый для интерпретации содержимого файла. По умолчанию uint8.

mode{‘r+’, ‘r’, ‘w+’, ‘c’}, опционально

Файл открывается в этом режиме:

‘r’

Открыть существующий файл только для чтения.

‘r+’

Открыть существующий файл для чтения и записи.

'w+'

Создать или перезаписать существующий файл для чтения и записи. Если mode == 'w+' затем shape также должен быть указан.

'c'

Копирование при записи: присваивания влияют на данные в памяти, но изменения не сохраняются на диск. Файл на диске доступен только для чтения.

По умолчанию 'r+'.

смещениеint, необязательный

В файле данные массива начинаются с этого смещения. Поскольку смещение измеряется в байтах, обычно должен быть кратен размеру байта dtype. Когда mode != 'r', даже положительные смещения за концом файла допустимы; файл будет расширен для размещения дополнительных данных. По умолчанию, memmap начнется с начала файла, даже если filename является файловым указателем fp и fp.tell() != 0.

shapeint или последовательность ints, необязательно

Желаемая форма массива. Если mode == 'r' и количество оставшихся байтов после смещение не кратен размеру в байтах для dtype, вы должны указать shape. По умолчанию возвращаемый массив будет 1-D с количеством элементов, определённым размером файла и типом данных.

Изменено в версии 2.0: Параметр shape теперь может быть любой последовательностью целых чисел, ранее типы были ограничены кортежем и int.

порядок{'C', 'F'}, опционально

Укажите порядок расположения памяти ndarray: row-major, C-style или column-major, в стиле Fortran. Это имеет эффект только если форма больше 1-D. Порядок по умолчанию — 'C'.

Смотрите также

lib.format.open_memmap

Создать или загрузить отображённый в память .npy файл.

Примечания

Объект memmap может использоваться везде, где принимается ndarray. Учитывая memmap fp, isinstance(fp, numpy.ndarray) возвращает True.

Файлы, отображаемые в память, не могут быть больше 2 ГБ в 32-битных системах.

Когда memmap приводит к созданию файла или расширению его текущего размера в файловой системе, содержимое новой части не определено. В системах с семантикой файловой системы POSIX расширенная часть будет заполнена нулевыми байтами.

Примеры

>>> import numpy as np
>>> data = np.arange(12, dtype='float32')
>>> data.resize((3,4))

В этом примере используется временный файл, чтобы doctest не записывал файлы в ваш каталог. Вы бы использовали 'обычное' имя файла.

>>> from tempfile import mkdtemp
>>> import os.path as path
>>> filename = path.join(mkdtemp(), 'newfile.dat')

Создайте memmap с dtype и формой, соответствующими нашим данным:

>>> fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
>>> fp
memmap([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]], dtype=float32)

Запись данных в memmap-массив:

>>> fp[:] = data[:]
>>> fp
memmap([[  0.,   1.,   2.,   3.],
        [  4.,   5.,   6.,   7.],
        [  8.,   9.,  10.,  11.]], dtype=float32)
>>> fp.filename == path.abspath(filename)
True

Сбрасывает изменения памяти на диск, чтобы прочитать их обратно

>>> fp.flush()

Загрузите memmap и проверьте, что данные были сохранены:

>>> newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
>>> newfp
memmap([[  0.,   1.,   2.,   3.],
        [  4.,   5.,   6.,   7.],
        [  8.,   9.,  10.,  11.]], dtype=float32)

Только для чтения memmap:

>>> fpr = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
>>> fpr.flags.writeable
False

Memmap с копированием при записи:

>>> fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4))
>>> fpc.flags.writeable
True

Можно присваивать значения массиву с копированием при записи, но значения записываются только в копию памяти массива, а не на диск:

>>> fpc
memmap([[  0.,   1.,   2.,   3.],
        [  4.,   5.,   6.,   7.],
        [  8.,   9.,  10.,  11.]], dtype=float32)
>>> fpc[0,:] = 0
>>> fpc
memmap([[  0.,   0.,   0.,   0.],
        [  4.,   5.,   6.,   7.],
        [  8.,   9.,  10.,  11.]], dtype=float32)

Файл на диске не изменён:

>>> fpr
memmap([[  0.,   1.,   2.,   3.],
        [  4.,   5.,   6.,   7.],
        [  8.,   9.,  10.,  11.]], dtype=float32)

Смещение в memmap:

>>> fpo = np.memmap(filename, dtype='float32', mode='r', offset=16)
>>> fpo
memmap([  4.,   5.,   6.,   7.,   8.,   9.,  10.,  11.], dtype=float32)
Атрибуты:
filenameэкземпляр str или pathlib.Path

Путь к отображаемому файлу.

смещениеint

Смещение позиции в файле.

modestr

Режим файла.

Методы

flush()

Записать любые изменения в массиве в файл на диске.