Wenn Sie die gesamte Datei von Anfang bis Ende lesen, ist es das Wichtigste, dies der Plattform mitzuteilen. Dies ermöglicht eine aggressive Vorauslesung und verhindert, dass der Cache mit Daten belastet wird, die ohnehin nicht mehr gelesen werden. Sie können dies entweder mit Memory Mapping oder ohne es tun. Die Schlüsselfunktionen sind posix_fadvise
und posix_madvise
.
Speicherzuordnung ist ein großer Gewinn, wenn Sie zufällige, kleine Zugriffe haben. Dies gilt insbesondere, wenn Sie mehrere Schreibvorgänge auf derselben Seite haben. Ohne Speicherzuordnung erfordert jedes Lesen oder Schreiben einen Benutzer/Kernel-Übergang und eine Kopie. Bei der Speicherzuordnung funktionieren die meisten Operationen nicht.
Aber mit sequenziellem Zugriff wird alles speichern die Kopie. Seltsamerweise können die Benutzer/Kernel-Übergänge noch schlechter sein. Bei großen sequenziellen Lesevorgängen erhalten Sie pro Lesevorgang einen Benutzer/Kernel-Übergang, der bei großen Leseoperationen je 256 KB betragen kann. Bei großem sequenziellem Zugriff auf eine im Speicher abgelegte Datei können Sie jede Seite fälschen (4 KB). Das hängt von den Optimierungsmöglichkeiten des Kernels ab.
Mit der Speicherzuordnung speichern Sie die Kopie jedoch, vorausgesetzt, Sie müssen die Kopie nicht kopieren. Wenn Sie aus irgendeinem Grund aus den abgebildeten Seiten kopieren müssen, können Sie auch eine read
Operation für Sie kopieren. Wenn Sie jedoch die Daten an Ort und Stelle bearbeiten können, kann die Speicherzuordnung ein Gewinn sein.
Es macht im Allgemeinen keinen so großen Unterschied wie die Leute denken, dass es so ist. Vor allem, wenn man darüber nachdenkt, wie langsam die Festplatte im Vergleich zu all dem ist.
Dies ist alles plattformspezifisch. Die Sprache C selbst bietet keine Möglichkeit, eine Datei im Speicher abzubilden. Sie erhalten keine sinnvolle Antwort auf den "Wie" -Teil, ohne die Plattform anzugeben. Sie erhalten keine vernünftige Antwort auf den "Warum" -Teil ohne Details über die Zugriffsmuster. –
Es ist auf einer Linux-Plattform – AndroidDev93
Dann ist die kurze "wie" Antwort "Mann mmap". Aber für das "Warum" müssen wir immer noch das Zugriffsmuster kennen. (Random? Sequential? Jedes Byte nur einmal? Einige Bytes mehr als andere? Kleine liest? Große liest? Und liest das gerade?) –