numpy.memmap
-
class numpy.memmap[source] -
Создайте отображение памяти на массив, хранящийся в бинарном файле на диске.
Отображения памяти используются для доступа к небольшим сегментам больших файлов на диске без чтения всего файла в память. Numpy’s memmap — это объекты, похожие на массивы. Это отличается от модуля Python
mmap, который использует объекты типа файл.Этот подкласс 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. Это имеет эффект только если форма больше, чем 1-D. По умолчанию порядок равен ‘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 и shape, которые соответствуют нашим данным:
>>> 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.11.0/reference/generated/numpy.memmap.html