• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1:mod:`mmap` --- Memory-mapped file support
2==========================================
3
4.. module:: mmap
5   :synopsis: Interface to memory-mapped files for Unix and Windows.
6
7--------------
8
9Memory-mapped file objects behave like both :class:`bytearray` and like
10:term:`file objects <file object>`.  You can use mmap objects in most places
11where :class:`bytearray` are expected; for example, you can use the :mod:`re`
12module to search through a memory-mapped file.  You can also change a single
13byte by doing ``obj[index] = 97``, or change a subsequence by assigning to a
14slice: ``obj[i1:i2] = b'...'``.  You can also read and write data starting at
15the current file position, and :meth:`seek` through the file to different positions.
16
17A memory-mapped file is created by the :class:`~mmap.mmap` constructor, which is
18different on Unix and on Windows.  In either case you must provide a file
19descriptor for a file opened for update. If you wish to map an existing Python
20file object, use its :meth:`fileno` method to obtain the correct value for the
21*fileno* parameter.  Otherwise, you can open the file using the
22:func:`os.open` function, which returns a file descriptor directly (the file
23still needs to be closed when done).
24
25.. note::
26   If you want to create a memory-mapping for a writable, buffered file, you
27   should :func:`~io.IOBase.flush` the file first.  This is necessary to ensure
28   that local modifications to the buffers are actually available to the
29   mapping.
30
31For both the Unix and Windows versions of the constructor, *access* may be
32specified as an optional keyword parameter. *access* accepts one of four
33values: :const:`ACCESS_READ`, :const:`ACCESS_WRITE`, or :const:`ACCESS_COPY` to
34specify read-only, write-through or copy-on-write memory respectively, or
35:const:`ACCESS_DEFAULT` to defer to *prot*.  *access* can be used on both Unix
36and Windows.  If *access* is not specified, Windows mmap returns a
37write-through mapping.  The initial memory values for all three access types
38are taken from the specified file.  Assignment to an :const:`ACCESS_READ`
39memory map raises a :exc:`TypeError` exception.  Assignment to an
40:const:`ACCESS_WRITE` memory map affects both memory and the underlying file.
41Assignment to an :const:`ACCESS_COPY` memory map affects memory but does not
42update the underlying file.
43
44.. versionchanged:: 3.7
45   Added :const:`ACCESS_DEFAULT` constant.
46
47To map anonymous memory, -1 should be passed as the fileno along with the length.
48
49.. class:: mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset])
50
51   **(Windows version)** Maps *length* bytes from the file specified by the
52   file handle *fileno*, and creates a mmap object.  If *length* is larger
53   than the current size of the file, the file is extended to contain *length*
54   bytes.  If *length* is ``0``, the maximum length of the map is the current
55   size of the file, except that if the file is empty Windows raises an
56   exception (you cannot create an empty mapping on Windows).
57
58   *tagname*, if specified and not ``None``, is a string giving a tag name for
59   the mapping.  Windows allows you to have many different mappings against
60   the same file.  If you specify the name of an existing tag, that tag is
61   opened, otherwise a new tag of this name is created.  If this parameter is
62   omitted or ``None``, the mapping is created without a name.  Avoiding the
63   use of the tag parameter will assist in keeping your code portable between
64   Unix and Windows.
65
66   *offset* may be specified as a non-negative integer offset. mmap references
67   will be relative to the offset from the beginning of the file. *offset*
68   defaults to 0.  *offset* must be a multiple of the :const:`ALLOCATIONGRANULARITY`.
69
70   .. audit-event:: mmap.__new__ fileno,length,access,offset mmap.mmap
71
72.. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])
73   :noindex:
74
75   **(Unix version)** Maps *length* bytes from the file specified by the file
76   descriptor *fileno*, and returns a mmap object.  If *length* is ``0``, the
77   maximum length of the map will be the current size of the file when
78   :class:`~mmap.mmap` is called.
79
80   *flags* specifies the nature of the mapping. :const:`MAP_PRIVATE` creates a
81   private copy-on-write mapping, so changes to the contents of the mmap
82   object will be private to this process, and :const:`MAP_SHARED` creates a
83   mapping that's shared with all other processes mapping the same areas of
84   the file.  The default value is :const:`MAP_SHARED`. Some systems have
85   additional possible flags with the full list specified in
86   :ref:`MAP_* constants <map-constants>`.
87
88   *prot*, if specified, gives the desired memory protection; the two most
89   useful values are :const:`PROT_READ` and :const:`PROT_WRITE`, to specify
90   that the pages may be read or written.  *prot* defaults to
91   :const:`PROT_READ \| PROT_WRITE`.
92
93   *access* may be specified in lieu of *flags* and *prot* as an optional
94   keyword parameter.  It is an error to specify both *flags*, *prot* and
95   *access*.  See the description of *access* above for information on how to
96   use this parameter.
97
98   *offset* may be specified as a non-negative integer offset. mmap references
99   will be relative to the offset from the beginning of the file. *offset*
100   defaults to 0. *offset* must be a multiple of :const:`ALLOCATIONGRANULARITY`
101   which is equal to :const:`PAGESIZE` on Unix systems.
102
103   To ensure validity of the created memory mapping the file specified
104   by the descriptor *fileno* is internally automatically synchronized
105   with physical backing store on macOS and OpenVMS.
106
107   This example shows a simple way of using :class:`~mmap.mmap`::
108
109      import mmap
110
111      # write a simple example file
112      with open("hello.txt", "wb") as f:
113          f.write(b"Hello Python!\n")
114
115      with open("hello.txt", "r+b") as f:
116          # memory-map the file, size 0 means whole file
117          mm = mmap.mmap(f.fileno(), 0)
118          # read content via standard file methods
119          print(mm.readline())  # prints b"Hello Python!\n"
120          # read content via slice notation
121          print(mm[:5])  # prints b"Hello"
122          # update content using slice notation;
123          # note that new content must have same size
124          mm[6:] = b" world!\n"
125          # ... and read again using standard file methods
126          mm.seek(0)
127          print(mm.readline())  # prints b"Hello  world!\n"
128          # close the map
129          mm.close()
130
131
132   :class:`~mmap.mmap` can also be used as a context manager in a :keyword:`with`
133   statement::
134
135      import mmap
136
137      with mmap.mmap(-1, 13) as mm:
138          mm.write(b"Hello world!")
139
140   .. versionadded:: 3.2
141      Context manager support.
142
143
144   The next example demonstrates how to create an anonymous map and exchange
145   data between the parent and child processes::
146
147      import mmap
148      import os
149
150      mm = mmap.mmap(-1, 13)
151      mm.write(b"Hello world!")
152
153      pid = os.fork()
154
155      if pid == 0:  # In a child process
156          mm.seek(0)
157          print(mm.readline())
158
159          mm.close()
160
161   .. audit-event:: mmap.__new__ fileno,length,access,offset mmap.mmap
162
163   Memory-mapped file objects support the following methods:
164
165   .. method:: close()
166
167      Closes the mmap. Subsequent calls to other methods of the object will
168      result in a ValueError exception being raised. This will not close
169      the open file.
170
171
172   .. attribute:: closed
173
174      ``True`` if the file is closed.
175
176      .. versionadded:: 3.2
177
178
179   .. method:: find(sub[, start[, end]])
180
181      Returns the lowest index in the object where the subsequence *sub* is
182      found, such that *sub* is contained in the range [*start*, *end*].
183      Optional arguments *start* and *end* are interpreted as in slice notation.
184      Returns ``-1`` on failure.
185
186      .. versionchanged:: 3.5
187         Writable :term:`bytes-like object` is now accepted.
188
189
190   .. method:: flush([offset[, size]])
191
192      Flushes changes made to the in-memory copy of a file back to disk. Without
193      use of this call there is no guarantee that changes are written back before
194      the object is destroyed.  If *offset* and *size* are specified, only
195      changes to the given range of bytes will be flushed to disk; otherwise, the
196      whole extent of the mapping is flushed.  *offset* must be a multiple of the
197      :const:`PAGESIZE` or :const:`ALLOCATIONGRANULARITY`.
198
199      ``None`` is returned to indicate success.  An exception is raised when the
200      call failed.
201
202      .. versionchanged:: 3.8
203         Previously, a nonzero value was returned on success; zero was returned
204         on error under Windows.  A zero value was returned on success; an
205         exception was raised on error under Unix.
206
207
208   .. method:: madvise(option[, start[, length]])
209
210      Send advice *option* to the kernel about the memory region beginning at
211      *start* and extending *length* bytes.  *option* must be one of the
212      :ref:`MADV_* constants <madvise-constants>` available on the system.  If
213      *start* and *length* are omitted, the entire mapping is spanned.  On
214      some systems (including Linux), *start* must be a multiple of the
215      :const:`PAGESIZE`.
216
217      Availability: Systems with the ``madvise()`` system call.
218
219      .. versionadded:: 3.8
220
221
222   .. method:: move(dest, src, count)
223
224      Copy the *count* bytes starting at offset *src* to the destination index
225      *dest*.  If the mmap was created with :const:`ACCESS_READ`, then calls to
226      move will raise a :exc:`TypeError` exception.
227
228
229   .. method:: read([n])
230
231      Return a :class:`bytes` containing up to *n* bytes starting from the
232      current file position. If the argument is omitted, ``None`` or negative,
233      return all bytes from the current file position to the end of the
234      mapping. The file position is updated to point after the bytes that were
235      returned.
236
237      .. versionchanged:: 3.3
238         Argument can be omitted or ``None``.
239
240   .. method:: read_byte()
241
242      Returns a byte at the current file position as an integer, and advances
243      the file position by 1.
244
245
246   .. method:: readline()
247
248      Returns a single line, starting at the current file position and up to the
249      next newline. The file position is updated to point after the bytes that were
250      returned.
251
252
253   .. method:: resize(newsize)
254
255      Resizes the map and the underlying file, if any. If the mmap was created
256      with :const:`ACCESS_READ` or :const:`ACCESS_COPY`, resizing the map will
257      raise a :exc:`TypeError` exception.
258
259
260   .. method:: rfind(sub[, start[, end]])
261
262      Returns the highest index in the object where the subsequence *sub* is
263      found, such that *sub* is contained in the range [*start*, *end*].
264      Optional arguments *start* and *end* are interpreted as in slice notation.
265      Returns ``-1`` on failure.
266
267      .. versionchanged:: 3.5
268         Writable :term:`bytes-like object` is now accepted.
269
270
271   .. method:: seek(pos[, whence])
272
273      Set the file's current position.  *whence* argument is optional and
274      defaults to ``os.SEEK_SET`` or ``0`` (absolute file positioning); other
275      values are ``os.SEEK_CUR`` or ``1`` (seek relative to the current
276      position) and ``os.SEEK_END`` or ``2`` (seek relative to the file's end).
277
278
279   .. method:: size()
280
281      Return the length of the file, which can be larger than the size of the
282      memory-mapped area.
283
284
285   .. method:: tell()
286
287      Returns the current position of the file pointer.
288
289
290   .. method:: write(bytes)
291
292      Write the bytes in *bytes* into memory at the current position of the
293      file pointer and return the number of bytes written (never less than
294      ``len(bytes)``, since if the write fails, a :exc:`ValueError` will be
295      raised).  The file position is updated to point after the bytes that
296      were written.  If the mmap was created with :const:`ACCESS_READ`, then
297      writing to it will raise a :exc:`TypeError` exception.
298
299      .. versionchanged:: 3.5
300         Writable :term:`bytes-like object` is now accepted.
301
302      .. versionchanged:: 3.6
303         The number of bytes written is now returned.
304
305
306   .. method:: write_byte(byte)
307
308      Write the integer *byte* into memory at the current
309      position of the file pointer; the file position is advanced by ``1``. If
310      the mmap was created with :const:`ACCESS_READ`, then writing to it will
311      raise a :exc:`TypeError` exception.
312
313.. _madvise-constants:
314
315MADV_* Constants
316++++++++++++++++
317
318.. data:: MADV_NORMAL
319          MADV_RANDOM
320          MADV_SEQUENTIAL
321          MADV_WILLNEED
322          MADV_DONTNEED
323          MADV_REMOVE
324          MADV_DONTFORK
325          MADV_DOFORK
326          MADV_HWPOISON
327          MADV_MERGEABLE
328          MADV_UNMERGEABLE
329          MADV_SOFT_OFFLINE
330          MADV_HUGEPAGE
331          MADV_NOHUGEPAGE
332          MADV_DONTDUMP
333          MADV_DODUMP
334          MADV_FREE
335          MADV_NOSYNC
336          MADV_AUTOSYNC
337          MADV_NOCORE
338          MADV_CORE
339          MADV_PROTECT
340          MADV_FREE_REUSABLE
341          MADV_FREE_REUSE
342
343   These options can be passed to :meth:`mmap.madvise`.  Not every option will
344   be present on every system.
345
346   Availability: Systems with the madvise() system call.
347
348   .. versionadded:: 3.8
349
350.. _map-constants:
351
352MAP_* Constants
353+++++++++++++++
354
355.. data:: MAP_SHARED
356          MAP_PRIVATE
357          MAP_DENYWRITE
358          MAP_EXECUTABLE
359          MAP_ANON
360          MAP_ANONYMOUS
361          MAP_POPULATE
362
363    These are the various flags that can be passed to :meth:`mmap.mmap`. Note that some options might not be present on some systems.
364
365    .. versionchanged:: 3.10
366       Added MAP_POPULATE constant.
367