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()Записать любые изменения в массиве в файл на диске.