Ich implementiere persistente große konstante Arrays über mmap. Gibt es Tipps und Tricks oder Tricks, die man bei der Verwendung von mmap beachten sollte?mmaping große Dateien (für persistente große Arrays)
Antwort
Alle Zeiger, die in der mmap'd-Region gespeichert sind, sollten als Offsets von der Basis der mmap-Region ausgeführt werden, nicht als echte Zeiger! Sie erhalten nicht unbedingt die gleiche Basisadresse, wenn Sie die Region beim nächsten Programmlauf mmapieren. (Ich musste Code aufräumen, der falsche Annahmen über die Basisadressenkonstanz der mmap-Region annahm).
Vergewissern Sie sich, dass die Dateigröße oder die Speichernutzung nicht eingeschränkt ist. Unter Linux gibt es einen eingebauten Shell-Befehl ulimit. Führen Sie als ulimit -a
, um die aktuellen Einstellungen zu sehen.
Flush schreibt in das In-Memory-Array in die Datei mit dem Msync (2) Syscall oder sonst bleiben sie im Speicher bis munmap (2) und es kann zu einem Stromausfall oder etwas davor kommen!
Wenn mehrere Prozesse dieselbe Speicherregion mit Lese- und Schreibberechtigungen teilen, stellen Sie sicher, dass nur jeweils einer in sie schreibt, um eine Beschädigung Ihrer Daten zu vermeiden. Oder verwenden Sie Dateisperrung oder eine andere Art der Synchronisierung.
Dies ist der einfachste Anwendungsfall für mmap(), also sollte es nicht viel geben, um Sie zu stolpern.
Sie laden gerade ein großes konstantes Array. Da es sich um Konstanten handelt, sollten Sie sich keine Gedanken über die Synchronisation machen. Es wäre ratsam, sicherzustellen, dass der Parameter prot nur auf PROT_READ gesetzt ist, da Sie nicht schreiben werden.
Wenn ein oder mehrere Programme, die die Konstanten verwenden, kontinuierlich ausgeführt werden, kann es sinnvoll sein, ein separates Programm zu haben, das die Daten lädt und resident hält. Läufe der anderen Programme machen dann im Wesentlichen nur einen Shared-Memory-Attach, anstatt die Datei ständig in den Speicher zu lesen.
- 1. Versionskontrolle für große Dateien
- 2. Versionskontrollsystem für große Dateien?
- 3. pread für sehr große Dateien
- 4. rekursive Merge-Sortierung, Segmentierungsfehler für große Arrays
- 5. Erfahrung mit PHP QuickHash für große Arrays
- 6. Hibernate - große Dateien speichern
- 7. swfbridge und große Dateien
- 8. Verwenden von Emacs für große große Projekte
- 9. CURL_RETURNTRANSFER Downloding große Dateien
- 10. Kann nicht große Arrays erstellen
- 11. C Programmierung Arrays große Ebene
- 12. Gleiches Layout für große und große Geräte
- 13. Django-Dateisystemspeicher für große Anzahl von Dateien
- 14. Piecemeal bzcompression für große Dateien in PHP
- 15. Verwenden von Tornado für große Dateien
- 16. Speicher erschöpft: für große Dateien mit diff
- 17. Atomic delete für große Mengen von Dateien
- 18. Get MD5 Checksum für sehr große Dateien
- 19. Stream sehr langsam für große Dateien
- 20. Fällt fread für große Dateien aus?
- 21. Bester Texteditor für große JSON-Dateien?
- 22. Effiziente Zusammenführung für viele große CSV-Dateien
- 23. Android-Anwendung erfordert große Dateien
- 24. Große Dateien in Git ablehnen
- 25. ANTLR4 Python Parsing große Dateien
- 26. große Dateien in C# Lesen
- 27. Filereader api auf große Dateien
- 28. Vergleicht man große XML-Dateien
- 29. Xampp - PHPMyAdmin große Dateien hochladen?
- 30. Filesystem Watcher und große Dateien
Spülen ist nicht notwendig, da die Daten konstant sind. –