numpy.memmap
- classnumpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')[source]
-
Создайте отображение памяти на массив, хранящийся в бинарном файле на диске.
Файлы с отображением памяти используются для доступа к небольшим сегментам больших файлов на диске без чтения всего файла в память. Memmap NumPy — это объекты, похожие на массивы. Это отличается от модуля Python
mmap, который использует объекты типа «файл».Этот подкласс ndarray имеет некоторые неприятные взаимодействия с некоторыми операциями, потому что он не совсем правильно вписывается в качестве подкласса. Альтернатива использованию этого подкласса заключается в создании объекта
mmapсамостоятельно, а затем создании ndarray с помощью ndarray.__new__ непосредственно, передавая созданный объект в его параметр «buffer=».Этот класс, возможно, в какой-то момент будет преобразован в функцию-фабрику, которая возвращает представление буфера mmap.
Очистить экземпляр memmap, чтобы записать изменения в файл. В настоящее время нет API для закрытия базового
mmap. Сложно гарантировать, что ресурс фактически закрыт, так как он может быть совместно используется между различными экземплярами memmap.- Parameters:
-
- filenamestr, объект-файл или экземпляр pathlib.Path
-
Имя файла или объект файла, используемый в качестве буфера данных массива.
- dtypeтип данных, необязательно
-
Тип данных, используемый для интерпретации содержимого файла. По умолчанию
uint8. - mode{‘r+’, ‘r’, ‘w+’, ‘c’}, необязательно
-
Файл открывается в этом режиме:
‘r’
Открыть существующий файл только для чтения.
‘r+’
Открыть существующий файл для чтения и записи.
‘w+’
Создать или перезаписать существующий файл для чтения и записи. Если
mode == 'w+'тоshapeтакже должен быть указан.‘c’
Копирование при записи: присваивания влияют на данные в памяти, но изменения не сохраняются на диск. Файл на диске является только для чтения.
По умолчанию «r+».
- offsetint, необязательно
-
В файле данные массива начинаются с этого смещения. Поскольку
offsetизмеряется в байтах, он обычно должен быть кратным размеру байтаdtype. Приmode != 'r', даже положительные смещения за концом файла допустимы; файл будет расширен для размещения дополнительных данных. По умолчаниюmemmapбудет начинаться с начала файла, даже еслиfilename— это указатель файлаfpиfp.tell() != 0. - shapeint или последовательность целых чисел, необязательно
-
Желаемая форма массива. Если
mode == 'r'и количество оставшихся байтов послеoffsetне кратно размеру байтаdtype, необходимо указатьshape. По умолчанию возвращаемый массив будет одномерным с количеством элементов, определяемым размером файла и типом данных.Изменено в версии 2.0: Параметр shape теперь может быть любым целочисленным типом последовательности, ранее типы были ограничены кортежем и целым числом.
- order{‘C’, ‘F’}, необязательно
-
Укажите порядок раскладки памяти ndarray: строчно-главный, стиль C или столбцово-главный, стиль Fortran. Это влияет только в том случае, если форма больше, чем одномерная. Порядок по умолчанию — «C».
См. также
lib.format.open_memmap-
Создать или загрузить файл с отображением памяти
.npy.
Примечания
Объект memmap можно использовать везде, где принимается ndarray. Учитывая memmap
fp,isinstance(fp, numpy.ndarray)возвращаетTrue.Файлы с отображением памяти не могут превышать 2 ГБ на 32-разрядных системах.
Когда memmap приводит к созданию или расширению файла за его текущий размер в файловой системе, содержимое новой части не определено. В системах с семантикой файловой системы POSIX расширенная часть будет заполнена нулевыми байтами.
Примеры
>>> 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 с типом данных и формой, соответствующей нашим данным:
>>> 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)
- Attributes:
-
- filenamestr или экземпляр pathlib.Path
-
Путь к файлу с отображением.
- offsetint
-
Позиция смещения в файле.
- modestr
-
Режим файла.
Методы
flush()Записать любые изменения в массиве в файл на диске.
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.memmap.html