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