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 oNone
, 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ía
mmap.__new__
con argumentosfileno
,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 cuandommap
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, yMAP_SHARED
crea un mapeo que se comparte con todos los demás procesos que mapean las mismas áreas del archivo. El valor predeterminado esMAP_SHARED
.prot, si se especifica, proporciona la protección de memoria deseada; los dos valores más útiles son
PROT_READ
yPROT_WRITE
, para especificar que las páginas se pueden leer o escribir. prot predeterminado aPROT_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 aPAGESIZE
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 unwith
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ía
mmap.__new__
con argumentosfileno
,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
oALLOCATIONGRANULARITY
.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 unTypeError
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
oACCESS_COPY
, cambiar el tamaño del mapa generará unTypeError
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
o0
(posicionamiento absoluto de archivos); otros valores sonos.SEEK_CUR
o1
(buscar en relación con la posición actual) yos.SEEK_END
o2
(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, unValueError
será elevado). La posición del archivo se actualiza para apuntar después de los bytes que se escribieron. Si el mmap se creó conACCESS_READ
, luego escribirle generará unTypeError
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ó conACCESS_READ
, luego escribirle generará unTypeError
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.