Frage

Ich brauche (Scan) eine Datei sequentiell zu lesen und dessen Inhalt verarbeiten. Dateigröße kann alles von sehr klein (einige KB) bis sehr groß (einige GB).

habe ich versucht, zwei Techniken VC10 / VS2010 auf Windows 7 64-Bit:

  1. Win32 Speicher abgebildeten Dateien (das heißt Create, Create, MapViewOfFile usw.)
  2. fopen und fread von CRT.

dachte ich, dass Memory-Mapped-Datei Technik könnte schneller sein als CRT-Funktionen, aber einige Tests zeigten, dass die Geschwindigkeit fast in beiden Fällen das gleiche ist.

Die folgenden C ++ Anweisungen sind für MMF verwendet:

HANDLE hFile = CreateFile(
    filename,
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_SEQUENTIAL_SCAN,
    NULL
    );

HANDLE hFileMapping = CreateFileMapping(
    hFile,
    NULL,
    PAGE_READONLY,
    0,
    0,
    NULL
    );

Die Datei gelesen wird sequentiell, Chunk Chunk; Jeder Block ist SYSTEM_INFO.dwAllocationGranularity groß.

, dass die Geschwindigkeit der Erwägung, ist fast das gleiche mit MMF und CRT, würde ich CRT-Funktionen verwenden, da sie einfacher und Multi-Plattform. Aber ich bin neugierig: bin ich richtig die MMF-Technik? Ist es normal, dass MMF Leistung in diesem Fall von scannig Datei nacheinander die gleiche wie CRT ist?

Danke.

War es hilfreich?

Lösung

Ich glaube, Sie nicht viel Unterschied sehen werden, wenn Sie auf die Datei zugreifen nacheinander. Da Datei-I / O sehr stark im Cache gespeichert, + Read-Ahead wahrscheinlich wird auch verwendet.

Die Sache wäre anders, wenn Sie viele haben „Sprünge“ bei der Dateidatenverarbeitung. Dann wird jedes Mal eine neue Datei Zeigers und einen neuen Dateileseabschnitt wird wahrscheinlich CRT töten, während MMF wird Ihnen die maximal mögliche Leistung

Andere Tipps

Da Sie die Datei nacheinander scannen würde ich nicht Disk Nutzungsmuster erwarten viel anders für beide Verfahren zu sein.

Für große Dateien MMF könnte Datenlokalität reduzieren und sogar zu einer Kopie alles oder einen Teil der Datei in der Auslagerungsdatei platziert wird, während über CRT Verarbeitung einen kleinen Puffer würde alle erfolgen im RAM. In diesem Fall würde MMF wahrscheinlich langsamer sein. Sie können dies abzumildern, indem nur Mapping in einem Teil der zugrunde liegenden Datei zu einer Zeit, aber dann die Dinge komplizierter, ohne dass wahrscheinlich direkte sequenzielle E / A gewinnen.

MMF ist wirklich die Art und Weise Windows-Geräte Interprozess der gemeinsamen Speicher, anstatt eine Art und Weise verallgemeinerte Datei zu beschleunigen I / O. Der Dateimanager-Cache im Kernel ist das, was Sie wirklich hier, um die Hebelwirkung benötigen.

Ich dachte, dass Memory-Mapped-Datei Technik könnte schneller sein als CRT Funktionen, aber einige Tests zeigten, dass die Geschwindigkeit ist fast das gleiche in beiden Fälle.

Sie schlagen wahrscheinlich das Dateisystem-Cache für Ihre Tests. Sofern Sie nicht ausdrücklich Datei-Handles zum Umgehen der Dateisystemcache (FILE_FLAG_NO_BUFFERING beim Aufruf CreateFile), die Dateisystem-Cache treten in und halten kürzlich verwendeten Dateien im Speicher erstellen.

Es gibt einen kleinen Geschwindigkeitsdifferenz zwischen Lesen einer Datei, die mit Pufferung eingeschaltet im Dateisystem-Cache ist, da das Betriebssystem eine zusätzliche Kopie zu erfüllen hat, sowie Systemaufruf Overhead. Aber für Ihre Zwecke, sollten Sie wahrscheinlich mit den CRT-Dateifunktionen bleiben.

Gustavo Duarte hat einen großen Artikel auf Memory-Mapped-Dateien (von einer generischen O Perspektive).

Beide Verfahren kommen schließlich auf die Festplatte nach unten i / o, dass Ihr Engpass sein wird. Ich würde mit einem Verfahren gehen, dass meine höheren Level-Funktionalität mehr mag -. Wenn ich brauche habe Streaming, ich mit Dateien gehen würde, wenn ich mit sequenziellem Zugriff und feste Größe Dateien benötigen, würde ich Memory-Mapped-Dateien betrachtet

oder im Fall, wenn Sie einen Algorithmus, die nur auf Speicher funktioniert, dann mem-Mapped-Dateien können einfache Art und Weise heraus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top