2012-04-15 7 views
0

Während der Verarbeitung einer sehr großen Binärdatei kann die Verwendung der Speicherzuordnung in C einen Unterschied im Vergleich zu fread ausmachen? Selbst wenn es kleine Zeitunterschiede gibt, wäre es in Ordnung. Und wenn es den Prozess fsater eine Idee macht, wie Speicherabbildung in einer großen Binärdatei zu verwenden und Daten daraus zu extrahieren?Speicherzuordnung in C verwenden, um Binärdateien zu lesen

Danke !!

+0

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. –

+0

Es ist auf einer Linux-Plattform – AndroidDev93

+0

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?) –

Antwort

1

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.

+0

Vielen Dank dafür. Also, wenn ich versuche, Memory Mapping zu tun, bekomme ich ein paar Kompilierungsfehler. Mein Code ist wie folgt: #include #include #include int fd; char * Daten; fd = offen ("data.bin", O_RDONLY); Daten = mmap ((caddr_t) 0, 4000, PROT_READ, MAP_SHARED, fd, 4000); Grundsätzlich bekomme ich eine Fehlermeldung, dass caddr_t isnn initialisiert und das gleiche für O_RDONLY. Es sagt auch, dass mmap zu wenig Argumente hat – AndroidDev93

+1

Der erste Parameter zu 'mmap' sollte nur' NULL' sein. Außerdem ist 4.000 kein gesetzlicher Versatz. (Der Offset muss ein Vielfaches der Seitengröße sein.) –