Los objetos de archivo asignados en memoria se comportan como ambos bytearray y, como objetos de archivo. Puede utilizar objetos mmap en la mayoría de los lugares donde bytearray son esperados; por ejemplo, puede utilizar el re módulo para buscar a través de un archivo mapeado en memoria. También puede cambiar un solo byte haciendo obj[index] = 97, o cambiar una subsecuencia asignando a un segmento: obj[i1:i2] = b'...'. También puede leer y escribir datos comenzando en la posición actual del archivo, y seek() a través del archivo a diferentes posiciones.

Un archivo mapeado en memoria es creado por el mmap constructor, que es diferente en Unix y en Windows. En cualquier caso, debe proporcionar un descriptor de archivo para un archivo abierto para su actualización. Si desea mapear un objeto de archivo Python existente, use su fileno() método para obtener el valor correcto para el fileno parámetro. De lo contrario, puede abrir el archivo con el os.open() función, que devuelve un descriptor de archivo directamente (el archivo aún debe cerrarse cuando haya terminado).

Nota

Si desea crear una asignación de memoria para un archivo almacenado en búfer y escribible, debe flush() el archivo primero. Esto es necesario para garantizar que las modificaciones locales de los búferes estén realmente disponibles para el mapeo.

Para las versiones de Unix y Windows del constructor, acceso se puede especificar como un parámetro de palabra clave opcional. acceso acepta uno de cuatro valores: ACCESS_READ, ACCESS_WRITE, o ACCESS_COPY para especificar memoria de solo lectura, escritura simultánea o copia en escritura respectivamente, o ACCESS_DEFAULT diferir a prot. acceso se puede utilizar tanto en Unix como en Windows. Si acceso no se especifica, mmap de Windows devuelve una asignación de escritura simultánea. Los valores de memoria iniciales para los tres tipos de acceso se toman del archivo especificado. Asignación a un ACCESS_READ mapa de memoria genera un TypeError excepción. Asignación a un ACCESS_WRITE El mapa de memoria afecta tanto a la memoria como al archivo subyacente. Asignación a un ACCESS_COPY El mapa de memoria afecta la memoria pero no actualiza el archivo subyacente.

Modificado en la versión 3.7: Adicional ACCESS_DEFAULT constante.

Para mapear memoria anónima, se debe pasar -1 como fileno junto con la longitud.

class mmap.mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset])

(Versión de Windows) Mapas largo bytes del archivo especificado por el identificador de archivo filenoy crea un objeto mmap. Si largo es más grande que el tamaño actual del archivo, el archivo se amplía para contener largo bytes. Si largo es 0, la longitud máxima del mapa es el tamaño actual del archivo, excepto que si el archivo está vacío, Windows genera una excepción (no puede crear un mapa vacío en Windows).

nombre de etiqueta, si se especifica y no None, es un string dando un nombre de etiqueta para el mapeo. Windows le permite tener muchas asignaciones diferentes contra el mismo archivo. Si especifica el nombre de una etiqueta existente, esa etiqueta se abre; de ​​lo contrario, se crea una nueva etiqueta con este nombre. Si este parámetro se omite o None, el mapeo se crea sin un nombre. Evitar el uso del parámetro de etiqueta ayudará a mantener su código portátil entre Unix y Windows.

compensar se puede especificar como un desplazamiento entero no negativo. Las referencias de mmap serán relativas al desplazamiento desde el principio del archivo. compensar por defecto es 0. compensar debe ser un múltiplo de la ALLOCATIONGRANULARITY.

Plantea un evento de auditoríammap.__new__ con argumentos fileno, length, access, offset.

class mmap.mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])

(Versión Unix) Mapas largo bytes del archivo especificado por el descriptor de archivo filenoy devuelve un objeto mmap. Si largo es 0, la longitud máxima del mapa será el tamaño actual del archivo cuando mmap se llama.

banderas especifica la naturaleza del mapeo. MAP_PRIVATE crea un mapeo privado de copia en escritura, por lo que los cambios en el contenido del objeto mmap serán privados para este proceso, y MAP_SHARED crea un mapeo que se comparte con todos los demás procesos que mapean las mismas áreas del archivo. El valor predeterminado es MAP_SHARED.

prot, si se especifica, proporciona la protección de memoria deseada; los dos valores más útiles son PROT_READ y PROT_WRITE, para especificar que las páginas se pueden leer o escribir. prot predeterminado a PROT_READ | PROT_WRITE.

acceso puede especificarse en lugar de banderas y prot como un parámetro de palabra clave opcional. Es un error especificar ambos banderas, prot y acceso. Ver la descripción de acceso arriba para obtener información sobre cómo utilizar este parámetro.

compensar se puede especificar como un desplazamiento entero no negativo. Las referencias de mmap serán relativas al desplazamiento desde el principio del archivo. compensar por defecto es 0. compensar debe ser un múltiplo de ALLOCATIONGRANULARITY que es igual a PAGESIZE en sistemas Unix.

Para asegurar la validez del mapeo de memoria creado el archivo especificado por el descriptor fileno se sincroniza internamente de forma automática con el almacenamiento de respaldo físico en Mac OS X y OpenVMS.

Este ejemplo muestra una forma sencilla de utilizar mmap:

import mmap

# write a simple example filewithopen("hello.txt","wb")as f:
    f.write(b"Hello Python!n")withopen("hello.txt","r+b")as f:# memory-map the file, size 0 means whole file
    mm = mmap.mmap(f.fileno(),0)# read content via standard file methodsprint(mm.readline())# prints b"Hello Python!n"# read content via slice notationprint(mm[:5])# prints b"Hello"# update content using slice notation;# note that new content must have same size
    mm[6:]=b" world!n"# ... and read again using standard file methods
    mm.seek(0)print(mm.readline())# prints b"Hello  world!n"# close the map
    mm.close()

mmap También se puede utilizar como administrador de contexto en un with declaración:

import mmap

with mmap.mmap(-1,13)as mm:
    mm.write(b"Hello world!")

Nuevo en la versión 3.2: Soporte de administrador de contexto.

El siguiente ejemplo demuestra cómo crear un mapa anónimo e intercambiar datos entre los procesos padre e hijo:

import mmap
import os

mm = mmap.mmap(-1,13)
mm.write(b"Hello world!")

pid = os.fork()if pid ==0:# In a child process
    mm.seek(0)print(mm.readline())

    mm.close()

Plantea un evento de auditoríammap.__new__ con argumentos fileno, length, access, offset.

Los objetos de archivo asignados en memoria admiten los siguientes métodos:

close()

Cierra el mmap. Las llamadas posteriores a otros métodos del objeto darán como resultado una excepción ValueError. Esto no cerrará el archivo abierto.

closed

True si el archivo está cerrado.

Nuevo en la versión 3.2.

find(sub[, start[, end]])

Devuelve el índice más bajo en el objeto donde la subsecuencia sub se encuentra, de modo que sub está contenido en el rango [start, end]. Argumentos opcionales comienzo y fin se interpretan como en notación de corte. Devoluciones -1 en caso de falla.

Modificado en la versión 3.5: Escribible objeto similar a bytes ahora se acepta.

flush([offset[, size]])

Vuelve al disco los cambios realizados en la copia en memoria de un archivo. Sin el uso de esta llamada, no hay garantía de que los cambios se escriban antes de que se destruya el objeto. Si compensar y Talla se especifican, solo los cambios en el rango de bytes dado se descargarán en el disco; de lo contrario, se elimina toda la extensión del mapeo. compensar debe ser un múltiplo de la PAGESIZE o ALLOCATIONGRANULARITY.

None se devuelve para indicar éxito. Se genera una excepción cuando falla la llamada.

Modificado en la versión 3.8: Anteriormente, se devolvía un valor distinto de cero en caso de éxito; Se devolvió cero por error en Windows. Se devolvió un valor cero en caso de éxito; se generó una excepción por error en Unix.

madvise(option[, start[, length]])

Enviar consejo opción al kernel sobre la región de memoria que comienza en comienzo y extendiendo largo bytes. opción debe ser uno de los MADV_ * constantes disponible en el sistema. Si comienzo y largo se omiten, se amplía todo el mapeo. En algunos sistemas (incluido Linux), comienzo debe ser un múltiplo de la PAGESIZE.

Disponibilidad: Sistemas con el madvise() llamada al sistema.

Nuevo en la versión 3.8.

move(dest, src, count)

Copia el contar bytes comenzando en el desplazamiento src al índice de destino dest. Si el mmap se creó con ACCESS_READ, entonces las llamadas para moverse generarán un TypeError excepción.

read([n])

Devolver un bytes conteniendo hasta norte bytes a partir de la posición actual del archivo. Si se omite el argumento, None o negativo, devuelve todos los bytes desde la posición actual del archivo hasta el final de la asignación. La posición del archivo se actualiza para apuntar después de los bytes que se devolvieron.

Modificado en la versión 3.3: El argumento se puede omitir o None.

read_byte()

Devuelve un byte en la posición actual del archivo como un número entero y avanza la posición del archivo en 1.

readline()

Devuelve una sola línea, comenzando en la posición actual del archivo y hasta la siguiente nueva línea. La posición del archivo se actualiza para apuntar después de los bytes que se devolvieron.

resize(newsize)

Cambia el tamaño del mapa y del archivo subyacente, si lo hay. Si el mmap se creó con ACCESS_READ o ACCESS_COPY, cambiar el tamaño del mapa generará un TypeError excepción.

rfind(sub[, start[, end]])

Devuelve el índice más alto en el objeto donde la subsecuencia sub se encuentra, de modo que sub está contenido en el rango [start, end]. Argumentos opcionales comienzo y fin se interpretan como en notación de corte. Devoluciones -1 en caso de falla.

Modificado en la versión 3.5: Escribible objeto similar a bytes ahora se acepta.

seek(pos[, whence])

Establece la posición actual del archivo. De dónde El argumento es opcional y por defecto es os.SEEK_SET o 0 (posicionamiento absoluto de archivos); otros valores son os.SEEK_CUR o 1 (buscar en relación con la posición actual) y os.SEEK_END o 2 (búsqueda relativa al final del archivo).

size()

Devuelve la longitud del archivo, que puede ser mayor que el tamaño del área asignada en memoria.

tell()

Devuelve la posición actual del puntero del archivo.

write(bytes)

Escribe los bytes en bytes en la memoria en la posición actual del puntero del archivo y devuelve el número de bytes escritos (nunca menos de len(bytes), ya que si la escritura falla, un ValueError será elevado). La posición del archivo se actualiza para apuntar después de los bytes que se escribieron. Si el mmap se creó con ACCESS_READ, luego escribirle generará un TypeError excepción.

Modificado en la versión 3.5: Escribible objeto similar a bytes ahora se acepta.

Modificado en la versión 3.6: Ahora se devuelve el número de bytes escritos.

write_byte(byte)

Escribe el entero byte en la memoria en la posición actual del puntero del archivo; la posición del archivo avanza por 1. Si el mmap se creó con ACCESS_READ, luego escribirle generará un TypeError excepción.

MADV_ * Constantes

mmap.MADV_NORMAL
mmap.MADV_RANDOM
mmap.MADV_SEQUENTIAL
mmap.MADV_WILLNEED
mmap.MADV_DONTNEED
mmap.MADV_REMOVE
mmap.MADV_DONTFORK
mmap.MADV_DOFORK
mmap.MADV_HWPOISON
mmap.MADV_MERGEABLE
mmap.MADV_UNMERGEABLE
mmap.MADV_SOFT_OFFLINE
mmap.MADV_HUGEPAGE
mmap.MADV_NOHUGEPAGE
mmap.MADV_DONTDUMP
mmap.MADV_DODUMP
mmap.MADV_FREE
mmap.MADV_NOSYNC
mmap.MADV_AUTOSYNC
mmap.MADV_NOCORE
mmap.MADV_CORE
mmap.MADV_PROTECT

Estas opciones se pueden pasar a mmap.madvise(). No todas las opciones estarán presentes en todos los sistemas.

Disponibilidad: Sistemas con la llamada al sistema madvise ().

Nuevo en la versión 3.8.