mmap — Unterstützung für speicherabgebildete Dateien¶
Verfügbarkeit: nicht WASI.
Dieses Modul funktioniert nicht oder ist nicht auf WebAssembly verfügbar. Weitere Informationen finden Sie unter WebAssembly-Plattformen.
Speicherabgebildete Datei-Objekte verhalten sich sowohl wie bytearray als auch wie Datei-Objekte. Sie können mmap-Objekte an den meisten Stellen verwenden, wo bytearray erwartet wird; zum Beispiel können Sie das Modul re verwenden, um eine speicherabgebildete Datei zu durchsuchen. Sie können auch ein einzelnes Byte ändern, indem Sie obj[index] = 97 verwenden, oder eine Teilsequenz ändern, indem Sie einer Slice zuweisen: obj[i1:i2] = b'...'. Sie können auch Daten ab der aktuellen Dateiposition lesen und schreiben und mit seek() zu verschiedenen Positionen im Datei springen.
Eine speicherabgebildete Datei wird durch den Konstruktor mmap erstellt, der sich unter Unix und unter Windows unterscheidet. In beiden Fällen müssen Sie einen Dateideskriptor für eine zum Aktualisieren geöffnete Datei angeben. Wenn Sie ein vorhandenes Python-Datei-Objekt abbilden möchten, verwenden Sie dessen Methode fileno(), um den korrekten Wert für den Parameter fileno zu erhalten. Andernfalls können Sie die Datei mit der Funktion os.open() öffnen, die direkt einen Dateideskriptor zurückgibt (die Datei muss danach noch geschlossen werden).
Hinweis
Wenn Sie eine Speicherabbildung für eine schreibbare, gepufferte Datei erstellen möchten, sollten Sie die Datei zuerst flush(). Dies ist notwendig, um sicherzustellen, dass lokale Modifikationen der Puffer tatsächlich für die Abbildung verfügbar sind.
Sowohl für die Unix- als auch für die Windows-Version des Konstruktors kann access als optionaler Schlüsselwortparameter angegeben werden. access akzeptiert einen von vier Werten: ACCESS_READ, ACCESS_WRITE oder ACCESS_COPY, um schreibgeschützte, Write-Through- oder Copy-on-Write-Speicher anzugeben, oder ACCESS_DEFAULT, um auf prot zurückzugreifen. access kann sowohl unter Unix als auch unter Windows verwendet werden. Wenn access nicht angegeben ist, gibt Windows mmap eine Write-Through-Abbildung zurück. Die anfänglichen Speicherwerte für alle drei Zugriffstypen werden aus der angegebenen Datei übernommen. Die Zuweisung zu einer ACCESS_READ-Speicherabbildung löst eine TypeError-Ausnahme aus. Die Zuweisung zu einer ACCESS_WRITE-Speicherabbildung wirkt sich sowohl auf den Speicher als auch auf die zugrunde liegende Datei aus. Die Zuweisung zu einer ACCESS_COPY-Speicherabbildung wirkt sich auf den Speicher aus, aktualisiert aber nicht die zugrunde liegende Datei.
Geändert in Version 3.7: Konstante ACCESS_DEFAULT hinzugefügt.
Um anonymen Speicher abzubilden, sollte -1 zusammen mit der Länge als fileno übergeben werden.
- class mmap.mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT, offset=0)¶
(Windows-Version) Bildet length Bytes aus der Datei ab, die durch den Dateihandle fileno angegeben wird, und erstellt ein mmap-Objekt. Wenn length größer als die aktuelle Größe der Datei ist, wird die Datei erweitert, um length Bytes zu enthalten. Wenn length
0ist, ist die maximale Länge der Abbildung die aktuelle Größe der Datei, außer dass unter Windows eine Ausnahme ausgelöst wird, wenn die Datei leer ist (Sie können unter Windows keine leere Abbildung erstellen).tagname, falls angegeben und nicht
None, ist ein String, der einen Tag-Namen für die Abbildung angibt. Windows erlaubt es Ihnen, viele verschiedene Abbildungen auf dieselbe Datei zu haben. Wenn Sie den Namen eines vorhandenen Tags angeben, wird dieser Tag geöffnet, andernfalls wird ein neuer Tag mit diesem Namen erstellt. Wenn dieser Parameter weggelassen wird oderNoneist, wird die Abbildung ohne Namen erstellt. Die Vermeidung der Verwendung des Parameters tagname trägt zur Portabilität Ihres Codes zwischen Unix und Windows bei.offset kann als nicht-negativer Integer-Offset angegeben werden. mmap-Referenzen beziehen sich relativ zum Offset vom Anfang der Datei. offset hat den Standardwert 0. offset muss ein Vielfaches der
ALLOCATIONGRANULARITYsein.Löst ein Audit-Ereignis
mmap.__new__mit den Argumentenfileno,length,access,offsetaus.
- class mmap.mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE | PROT_READ, access=ACCESS_DEFAULT, offset=0, *, trackfd=True)
(Unix-Version) Bildet length Bytes aus der Datei ab, die durch den Dateideskriptor fileno angegeben wird, und gibt ein mmap-Objekt zurück. Wenn length
0ist, ist die maximale Länge der Abbildung die aktuelle Größe der Datei, wennmmapaufgerufen wird.flags gibt die Art der Abbildung an.
MAP_PRIVATEerstellt eine private Copy-on-Write-Abbildung, sodass Änderungen am Inhalt des mmap-Objekts nur für diesen Prozess gelten, undMAP_SHAREDerstellt eine Abbildung, die mit allen anderen Prozessen, die dieselben Bereiche der Datei abbilden, gemeinsam genutzt wird. Der Standardwert istMAP_SHARED. Einige Systeme haben zusätzliche mögliche Flags, die vollständige Liste ist in den MAP_* Konstanten aufgeführt.prot, falls angegeben, gibt den gewünschten Speicherschutz an; die beiden nützlichsten Werte sind
PROT_READundPROT_WRITE, um anzugeben, dass die Seiten gelesen oder geschrieben werden können. prot hat den StandardwertPROT_READ | PROT_WRITE.access kann anstelle von flags und prot als optionaler Schlüsselwortparameter angegeben werden. Es ist ein Fehler, sowohl flags, prot als auch access anzugeben. Siehe die Beschreibung von access oben für Informationen zur Verwendung dieses Parameters.
offset kann als nicht-negativer Integer-Offset angegeben werden. mmap-Referenzen beziehen sich relativ zum Offset vom Anfang der Datei. offset hat den Standardwert 0. offset muss ein Vielfaches von
ALLOCATIONGRANULARITYsein, was unter Unix-SystemenPAGESIZEentspricht.Wenn trackfd
Falseist, wird der durch fileno angegebene Dateideskriptor nicht dupliziert und das resultierendemmap-Objekt wird nicht mit der zugrunde liegenden Datei der Abbildung verknüpft. Das bedeutet, dass die Methodensize()undresize()fehlschlagen. Dieser Modus ist nützlich, um die Anzahl offener Dateideskriptoren zu begrenzen.Um die Gültigkeit der erstellten Speicherabbildung zu gewährleisten, wird die durch den Deskriptor fileno angegebene Datei unter macOS intern automatisch mit dem physischen Backing Store synchronisiert.
Geändert in Version 3.13: Der Parameter trackfd wurde hinzugefügt.
Dieses Beispiel zeigt eine einfache Möglichkeit,
mmapzu verwendenimport mmap # write a simple example file with open("hello.txt", "wb") as f: f.write(b"Hello Python!\n") with open("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 methods print(mm.readline()) # prints b"Hello Python!\n" # read content via slice notation print(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()
mmapkann auch als Kontextmanager in einerwith-Anweisung verwendet werdenimport mmap with mmap.mmap(-1, 13) as mm: mm.write(b"Hello world!")
Hinzugefügt in Version 3.2: Unterstützung für Kontextmanager.
Das nächste Beispiel demonstriert, wie eine anonyme Abbildung erstellt und Daten zwischen Eltern- und Kindprozessen ausgetauscht werden
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()
Löst ein Audit-Ereignis
mmap.__new__mit den Argumentenfileno,length,access,offsetaus.Speicherabgebildete Datei-Objekte unterstützen die folgenden Methoden
- close()¶
Schließt die mmap. Nachfolgende Aufrufe anderer Methoden des Objekts führen zu einer ValueError-Ausnahme. Dies schließt die geöffnete Datei nicht.
- closed¶
Wenn die Datei geschlossen ist, ist dies
True.Hinzugefügt in Version 3.2.
- find(sub[, start[, end]])¶
Gibt den niedrigsten Index im Objekt zurück, an dem die Teilsequenz sub gefunden wird, sodass sub im Bereich [start, end] enthalten ist. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert. Gibt im Fehlerfall
-1zurück.Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.
- flush()¶
- flush(offset, size, /)
Schreibt Änderungen, die an der In-Memory-Kopie einer Datei vorgenommen wurden, zurück auf die Festplatte. Ohne die Verwendung dieses Aufrufs gibt es keine Garantie, dass Änderungen zurückgeschrieben werden, bevor das Objekt zerstört wird. Wenn offset und size angegeben sind, werden nur Änderungen an dem angegebenen Bytebereich auf die Festplatte geschrieben; andernfalls wird der gesamte Bereich der Abbildung geleert. offset muss ein Vielfaches der
PAGESIZEoderALLOCATIONGRANULARITYsein.Gibt
Nonezurück, um Erfolg anzuzeigen. Eine Ausnahme wird ausgelöst, wenn der Aufruf fehlschlägt.Geändert in Version 3.8: Zuvor wurde unter Windows ein von Null verschiedener Wert bei Erfolg zurückgegeben; null wurde bei Fehler zurückgegeben. Unter Unix wurde bei Erfolg null zurückgegeben; bei Fehler wurde eine Ausnahme ausgelöst.
- madvise(option[, start[, length]])¶
Sendet den Rat option an den Kernel bezüglich des Speicherbereichs, der bei start beginnt und length Bytes umfasst. option muss eine der auf dem System verfügbaren MADV_* Konstanten sein. Wenn start und length weggelassen werden, wird die gesamte Abbildung abgedeckt. Auf einigen Systemen (einschließlich Linux) muss start ein Vielfaches der
PAGESIZEsein.Verfügbarkeit: Systeme mit dem
madvise()Systemaufruf.Hinzugefügt in Version 3.8.
- move(dest, src, count)¶
Kopiert die count Bytes, beginnend am Offset src, zum Zielindex dest. Wenn die mmap mit
ACCESS_READerstellt wurde, lösen Aufrufe von move eineTypeError-Ausnahme aus.
- read([n])¶
Gibt eine
byteszurück, die bis zu n Bytes ab der aktuellen Dateiposition enthält. Wenn das Argument weggelassen wird,Noneoder negativ ist, werden alle Bytes von der aktuellen Dateiposition bis zum Ende der Abbildung zurückgegeben. Die Dateiposition wird so aktualisiert, dass sie auf die zurückgegebenen Bytes folgt.Geändert in Version 3.3: Das Argument kann weggelassen oder
Nonesein.
- read_byte()¶
Gibt ein Byte an der aktuellen Dateiposition als Ganzzahl zurück und verschiebt die Dateiposition um 1.
- readline()¶
Gibt eine einzelne Zeile zurück, beginnend an der aktuellen Dateiposition und bis zum nächsten Zeilenumbruch. Die Dateiposition wird so aktualisiert, dass sie auf die zurückgegebenen Bytes folgt.
- resize(newsize)¶
Ändert die Größe der Abbildung und der zugrunde liegenden Datei, falls vorhanden.
Das Ändern der Größe einer mit access von
ACCESS_READoderACCESS_COPYerstellten Abbildung löst eineTypeError-Ausnahme aus. Das Ändern der Größe einer mit trackfd aufFalsegesetzten Abbildung löst eineValueError-Ausnahme aus.Unter Windows: Das Ändern der Größe der Abbildung löst eine
OSErroraus, wenn andere Abbildungen für dieselbe benannte Datei vorhanden sind. Das Ändern der Größe einer anonymen Abbildung (d. h. gegen die Auslagerungsdatei) erstellt stillschweigend eine neue Abbildung mit den ursprünglichen Daten, die bis zur Länge der neuen Größe kopiert werden.Geändert in Version 3.11: Schlägt korrekt fehl, wenn versucht wird, die Größe zu ändern, wenn eine andere Abbildung gehalten wird. Ermöglicht die Größenänderung gegenüber einer anonymen Abbildung unter Windows.
- rfind(sub[, start[, end]])¶
Gibt den höchsten Index im Objekt zurück, an dem die Teilsequenz sub gefunden wird, sodass sub im Bereich [start, end] enthalten ist. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert. Gibt im Fehlerfall
-1zurück.Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.
- seek(pos[, whence])¶
Setzt die aktuelle Position der Datei. Das Argument whence ist optional und hat den Standardwert
os.SEEK_SEToder0(absolute Dateipositionierung); andere Werte sindos.SEEK_CURoder1(relativ zur aktuellen Position suchen) undos.SEEK_ENDoder2(relativ zum Ende der Datei suchen).Geändert in Version 3.13: Gibt die neue absolute Position zurück anstelle von
None.
- seekable()¶
Gibt zurück, ob die Datei das Suchen unterstützt, und der Rückgabewert ist immer
True.Hinzugefügt in Version 3.13.
- size()¶
Gibt die Länge der Datei zurück, die größer sein kann als die Größe des speicherabgebildeten Bereichs.
- tell()¶
Gibt die aktuelle Position des Dateizeigers zurück.
- write(bytes)¶
Schreibt die Bytes in bytes an der aktuellen Position des Dateizeigers in den Speicher und gibt die Anzahl der geschriebenen Bytes zurück (nie weniger als
len(bytes), da bei einem Fehler beim Schreiben eineValueErrorausgelöst wird). Die Dateiposition wird so aktualisiert, dass sie auf die geschriebenen Bytes folgt. Wenn die mmap mitACCESS_READerstellt wurde, löst das Schreiben eineTypeError-Ausnahme aus.Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.
Geändert in Version 3.6: Die Anzahl der geschriebenen Bytes wird jetzt zurückgegeben.
MADV_* Konstanten¶
- 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¶
- mmap.MADV_FREE_REUSABLE¶
- mmap.MADV_FREE_REUSE¶
Diese Optionen können an
mmap.madvise()übergeben werden. Nicht jede Option ist auf jedem System vorhanden.Verfügbarkeit: Systeme mit dem madvise()-Systemaufruf.
Hinzugefügt in Version 3.8.
MAP_* Konstanten¶
- mmap.MAP_SHARED¶
- mmap.MAP_PRIVATE¶
- mmap.MAP_32BIT¶
- mmap.MAP_ALIGNED_SUPER¶
- mmap.MAP_ANON¶
- mmap.MAP_ANONYMOUS¶
- mmap.MAP_CONCEAL¶
- mmap.MAP_DENYWRITE¶
- mmap.MAP_EXECUTABLE¶
- mmap.MAP_HASSEMAPHORE¶
- mmap.MAP_JIT¶
- mmap.MAP_NOCACHE¶
- mmap.MAP_NOEXTEND¶
- mmap.MAP_NORESERVE¶
- mmap.MAP_POPULATE¶
- mmap.MAP_RESILIENT_CODESIGN¶
- mmap.MAP_RESILIENT_MEDIA¶
- mmap.MAP_STACK¶
- mmap.MAP_TPRO¶
- mmap.MAP_TRANSLATED_ALLOW_EXECUTE¶
- mmap.MAP_UNIX03¶
Dies sind die verschiedenen Flags, die an
mmap.mmap()übergeben werden können.MAP_ALIGNED_SUPERist nur unter FreeBSD verfügbar undMAP_CONCEAList nur unter OpenBSD verfügbar. Beachten Sie, dass einige Optionen auf bestimmten Systemen möglicherweise nicht vorhanden sind.Geändert in Version 3.10: Konstante
MAP_POPULATEhinzugefügt.Hinzugefügt in Version 3.11: Konstante
MAP_STACKhinzugefügt.Hinzugefügt in Version 3.12: Konstanten
MAP_ALIGNED_SUPERundMAP_CONCEALhinzugefügt.Hinzugefügt in Version 3.13: Konstanten
MAP_32BIT,MAP_HASSEMAPHORE,MAP_JIT,MAP_NOCACHE,MAP_NOEXTEND,MAP_NORESERVE,MAP_RESILIENT_CODESIGN,MAP_RESILIENT_MEDIA,MAP_TPRO,MAP_TRANSLATED_ALLOW_EXECUTEundMAP_UNIX03hinzugefügt.