numpy.memmap
-
class numpy.memmap[source] -
Создаёт карту памяти для массива, хранящегося в бинарном файле на диске.
Файлы с картами памяти используются для доступа к небольшим фрагментам больших файлов на диске без чтения всего файла в память. Memmap NumPy — это объекты, подобные массивам. Это отличается от модуля
mmapPython, который использует объекты типа «поток данных».Этот подкласс ndarray имеет некоторые неприятные взаимодействия с некоторыми операциями, потому что он не совсем подходит в качестве подкласса. Альтернативой использованию этого подкласса является создание объекта
mmapсамостоятельно, а затем создание ndarray с помощью ndarray.__new__ непосредственно, передав созданный объект в параметр «buffer=».Этот класс может в какой-то момент быть преобразован в функцию-фабрику, которая возвращает представление буфера mmap.
Удалите экземпляр memmap для закрытия.
Параметры: filename : str или объект потока данных
Имя файла или объект потока данных, используемый в качестве буфера данных массива.
dtype : тип данных, необязательно
Тип данных, используемый для интерпретации содержимого файла. По умолчанию
uint8.mode : {‘r+’, ‘r’, ‘w+’, ‘c’}, необязательно
Файл открывается в этом режиме:
‘r’ Открыть существующий файл только для чтения. ‘r+’ Открыть существующий файл для чтения и записи. ‘w+’ Создать или перезаписать существующий файл для чтения и записи. ‘c’ Копирование при записи: присваивания влияют на данные в памяти, но изменения не сохраняются на диск. Файл на диске — только для чтения. По умолчанию ‘r+’.
offset : int, необязательно
В файле данные массива начинаются с этого смещения. Поскольку
offsetизмеряется в байтах, обычно это должно быть кратно размеру байтаdtype. Когдаmode != 'r', даже положительные смещения за пределами конца файла допустимы; файл будет расширен для размещения дополнительных данных. По умолчаниюmemmapбудет начинаться с начала файла, даже еслиfilenameявляется указателем на файлfpиfp.tell() != 0.shape : кортеж, необязательно
Желаемая форма массива. Если
mode == 'r'и количество оставшихся байтов послеoffsetне кратно размеру байтаdtype, необходимо указатьshape. По умолчанию возвращаемый массив будет одномерным с числом элементов, определяемым размером файла и типом данных.order : {‘C’, ‘F’}, необязательно
Укажите порядок расположения памяти ndarray:
row-major, стиль C илиcolumn-major, стиль Fortran. Это имеет значение только если форма больше одномерной. По умолчанию порядок ‘C’.Примечания
Объект memmap можно использовать везде, где принимается ndarray. Учитывая memmap
fp,isinstance(fp, numpy.ndarray)возвращаетTrue.Массивы с картами памяти используют объект карты памяти Python, который (до Python 2.5) не позволяет файлам быть больше определённого размера в зависимости от платформы. Этот размер всегда меньше 2 ГБ даже на 64-битных системах.
Когда 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 с 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
Удаление сбрасывает изменения в памяти на диск перед удалением объекта:
>>> del fp
Загрузите 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) Путь к файлу, к которому привязана карта памяти. offset (int) Позиция смещения в файле. mode (str) Режим файла. Методы
flush()Записать все изменения в массиве в файл на диске.
© 2008–2016 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.memmap.html