Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 1 | \section{\module{mmap} --- |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 2 | Memory-mapped file support} |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 3 | |
| 4 | \declaremodule{builtin}{mmap} |
Fred Drake | c37b65e | 2001-11-28 07:26:15 +0000 | [diff] [blame] | 5 | \modulesynopsis{Interface to memory-mapped files for \UNIX\ and Windows.} |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 6 | |
Fred Drake | 1722e4a | 2001-12-03 18:27:22 +0000 | [diff] [blame] | 7 | Memory-mapped file objects behave like both strings and like |
| 8 | file objects. Unlike normal string objects, however, these are |
| 9 | mutable. You can use mmap objects in most places where strings |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 10 | are expected; for example, you can use the \module{re} module to |
| 11 | search through a memory-mapped file. Since they're mutable, you can |
Fred Drake | 8ff4cd7 | 2000-09-05 13:50:21 +0000 | [diff] [blame] | 12 | change a single character by doing \code{obj[\var{index}] = 'a'}, or |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 13 | change a substring by assigning to a slice: |
Fred Drake | 8ff4cd7 | 2000-09-05 13:50:21 +0000 | [diff] [blame] | 14 | \code{obj[\var{i1}:\var{i2}] = '...'}. You can also read and write |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 15 | data starting at the current file position, and \method{seek()} |
| 16 | through the file to different positions. |
| 17 | |
Fred Drake | 5055545 | 2001-09-25 19:00:08 +0000 | [diff] [blame] | 18 | A memory-mapped file is created by the \function{mmap()} function, |
| 19 | which is different on \UNIX{} and on Windows. In either case you must |
| 20 | provide a file descriptor for a file opened for update. |
| 21 | If you wish to map an existing Python file object, use its |
| 22 | \method{fileno()} method to obtain the correct value for the |
| 23 | \var{fileno} parameter. Otherwise, you can open the file using the |
| 24 | \function{os.open()} function, which returns a file descriptor |
| 25 | directly (the file still needs to be closed when done). |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 26 | |
Fred Drake | 1722e4a | 2001-12-03 18:27:22 +0000 | [diff] [blame] | 27 | For both the \UNIX{} and Windows versions of the function, |
| 28 | \var{access} may be specified as an optional keyword parameter. |
| 29 | \var{access} accepts one of three values: \constant{ACCESS_READ}, |
| 30 | \constant{ACCESS_WRITE}, or \constant{ACCESS_COPY} to specify |
| 31 | readonly, write-through or copy-on-write memory respectively. |
| 32 | \var{access} can be used on both \UNIX{} and Windows. If |
| 33 | \var{access} is not specified, Windows mmap returns a write-through |
| 34 | mapping. The initial memory values for all three access types are |
| 35 | taken from the specified file. Assignment to an |
| 36 | \constant{ACCESS_READ} memory map raises a \exception{TypeError} |
| 37 | exception. Assignment to an \constant{ACCESS_WRITE} memory map |
Fred Drake | b184ae8 | 2005-01-19 03:39:17 +0000 | [diff] [blame] | 38 | affects both memory and the underlying file. Assignment to an |
Fred Drake | 1722e4a | 2001-12-03 18:27:22 +0000 | [diff] [blame] | 39 | \constant{ACCESS_COPY} memory map affects memory but does not update |
| 40 | the underlying file. |
| 41 | |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 42 | \begin{funcdesc}{mmap}{fileno, length\optional{, tagname\optional{, access}}} |
| 43 | \strong{(Windows version)} Maps \var{length} bytes from the file |
| 44 | specified by the file handle \var{fileno}, and returns a mmap |
Tim Peters | 0b4d1ee | 2004-06-06 16:51:46 +0000 | [diff] [blame] | 45 | object. If \var{length} is larger than the current size of the file, |
| 46 | the file is extended to contain \var{length} bytes. If \var{length} |
| 47 | is \code{0}, the maximum length of the map is the current size |
| 48 | of the file, except that if the file is empty Windows raises an |
| 49 | exception (you cannot create an empty mapping on Windows). |
| 50 | |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 51 | \var{tagname}, if specified and not \code{None}, is a string giving |
| 52 | a tag name for the mapping. Windows allows you to have many |
| 53 | different mappings against the same file. If you specify the name |
| 54 | of an existing tag, that tag is opened, otherwise a new tag of this |
| 55 | name is created. If this parameter is omitted or \code{None}, the |
| 56 | mapping is created without a name. Avoiding the use of the tag |
| 57 | parameter will assist in keeping your code portable between \UNIX{} |
| 58 | and Windows. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 59 | \end{funcdesc} |
| 60 | |
Fred Drake | 1722e4a | 2001-12-03 18:27:22 +0000 | [diff] [blame] | 61 | \begin{funcdescni}{mmap}{fileno, length\optional{, flags\optional{, |
| 62 | prot\optional{, access}}}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 63 | \strong{(\UNIX{} version)} Maps \var{length} bytes from the file |
| 64 | specified by the file descriptor \var{fileno}, and returns a mmap |
Martin v. Löwis | 7fe60c0 | 2005-03-03 11:22:44 +0000 | [diff] [blame] | 65 | object. If \var{length} is \code{0}, the maximum length of the map |
| 66 | will be the current size of the file when \function{mmap(} is |
| 67 | called. |
| 68 | |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 69 | \var{flags} specifies the nature of the mapping. |
| 70 | \constant{MAP_PRIVATE} creates a private copy-on-write mapping, so |
| 71 | changes to the contents of the mmap object will be private to this |
| 72 | process, and \constant{MAP_SHARED} creates a mapping that's shared |
| 73 | with all other processes mapping the same areas of the file. The |
| 74 | default value is \constant{MAP_SHARED}. |
Tim Peters | 0b4d1ee | 2004-06-06 16:51:46 +0000 | [diff] [blame] | 75 | |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 76 | \var{prot}, if specified, gives the desired memory protection; the |
| 77 | two most useful values are \constant{PROT_READ} and |
| 78 | \constant{PROT_WRITE}, to specify that the pages may be read or |
| 79 | written. \var{prot} defaults to \constant{PROT_READ | PROT_WRITE}. |
Tim Peters | 0b4d1ee | 2004-06-06 16:51:46 +0000 | [diff] [blame] | 80 | |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 81 | \var{access} may be specified in lieu of \var{flags} and \var{prot} |
Fred Drake | 1722e4a | 2001-12-03 18:27:22 +0000 | [diff] [blame] | 82 | as an optional keyword parameter. It is an error to specify both |
| 83 | \var{flags}, \var{prot} and \var{access}. See the description of |
| 84 | \var{access} above for information on how to use this parameter. |
| 85 | \end{funcdescni} |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 86 | |
Fred Drake | 5055545 | 2001-09-25 19:00:08 +0000 | [diff] [blame] | 87 | |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 88 | Memory-mapped file objects support the following methods: |
| 89 | |
| 90 | |
| 91 | \begin{methoddesc}{close}{} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 92 | Close the file. Subsequent calls to other methods of the object |
| 93 | will result in an exception being raised. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 94 | \end{methoddesc} |
| 95 | |
Fred Drake | 8ff4cd7 | 2000-09-05 13:50:21 +0000 | [diff] [blame] | 96 | \begin{methoddesc}{find}{string\optional{, start}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 97 | Returns the lowest index in the object where the substring |
| 98 | \var{string} is found. Returns \code{-1} on failure. \var{start} |
| 99 | is the index at which the search begins, and defaults to zero. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 100 | \end{methoddesc} |
| 101 | |
Fred Drake | 8ff4cd7 | 2000-09-05 13:50:21 +0000 | [diff] [blame] | 102 | \begin{methoddesc}{flush}{\optional{offset, size}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 103 | Flushes changes made to the in-memory copy of a file back to disk. |
| 104 | Without use of this call there is no guarantee that changes are |
| 105 | written back before the object is destroyed. If \var{offset} and |
| 106 | \var{size} are specified, only changes to the given range of bytes |
| 107 | will be flushed to disk; otherwise, the whole extent of the mapping |
| 108 | is flushed. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 109 | \end{methoddesc} |
| 110 | |
| 111 | \begin{methoddesc}{move}{\var{dest}, \var{src}, \var{count}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 112 | Copy the \var{count} bytes starting at offset \var{src} to the |
| 113 | destination index \var{dest}. If the mmap was created with |
| 114 | \constant{ACCESS_READ}, then calls to move will throw a |
| 115 | \exception{TypeError} exception. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 116 | \end{methoddesc} |
| 117 | |
| 118 | \begin{methoddesc}{read}{\var{num}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 119 | Return a string containing up to \var{num} bytes starting from the |
| 120 | current file position; the file position is updated to point after the |
| 121 | bytes that were returned. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 122 | \end{methoddesc} |
| 123 | |
| 124 | \begin{methoddesc}{read_byte}{} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 125 | Returns a string of length 1 containing the character at the current |
| 126 | file position, and advances the file position by 1. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 127 | \end{methoddesc} |
| 128 | |
| 129 | \begin{methoddesc}{readline}{} |
Tim Peters | 0b4d1ee | 2004-06-06 16:51:46 +0000 | [diff] [blame] | 130 | Returns a single line, starting at the current file position and up to |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 131 | the next newline. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 132 | \end{methoddesc} |
| 133 | |
| 134 | \begin{methoddesc}{resize}{\var{newsize}} |
Georg Brandl | 38387b8 | 2005-08-24 07:17:40 +0000 | [diff] [blame] | 135 | Resizes the map and the underlying file, if any. |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 136 | If the mmap was created with \constant{ACCESS_READ} or |
| 137 | \constant{ACCESS_COPY}, resizing the map will throw a \exception{TypeError} exception. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 138 | \end{methoddesc} |
| 139 | |
Fred Drake | 8ff4cd7 | 2000-09-05 13:50:21 +0000 | [diff] [blame] | 140 | \begin{methoddesc}{seek}{pos\optional{, whence}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 141 | Set the file's current position. \var{whence} argument is optional |
| 142 | and defaults to \code{0} (absolute file positioning); other values |
| 143 | are \code{1} (seek relative to the current position) and \code{2} |
| 144 | (seek relative to the file's end). |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 145 | \end{methoddesc} |
| 146 | |
| 147 | \begin{methoddesc}{size}{} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 148 | Return the length of the file, which can be larger than the size of |
| 149 | the memory-mapped area. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 150 | \end{methoddesc} |
| 151 | |
| 152 | \begin{methoddesc}{tell}{} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 153 | Returns the current position of the file pointer. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 154 | \end{methoddesc} |
| 155 | |
| 156 | \begin{methoddesc}{write}{\var{string}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 157 | Write the bytes in \var{string} into memory at the current position |
| 158 | of the file pointer; the file position is updated to point after the |
| 159 | bytes that were written. If the mmap was created with |
| 160 | \constant{ACCESS_READ}, then writing to it will throw a |
| 161 | \exception{TypeError} exception. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 162 | \end{methoddesc} |
| 163 | |
| 164 | \begin{methoddesc}{write_byte}{\var{byte}} |
Tim Peters | 5ebfd36 | 2001-11-13 23:11:19 +0000 | [diff] [blame] | 165 | Write the single-character string \var{byte} into memory at the |
| 166 | current position of the file pointer; the file position is advanced |
| 167 | by \code{1}.If the mmap was created with \constant{ACCESS_READ}, |
| 168 | then writing to it will throw a \exception{TypeError} exception. |
Andrew M. Kuchling | b805069 | 2000-06-17 22:39:05 +0000 | [diff] [blame] | 169 | \end{methoddesc} |