Domanda

Ho bisogno di leggere (scansione) un file in sequenza ed elaborare il suo contenuto. dimensione del file può essere qualsiasi cosa, da molto piccolo (alcuni KB) a molto grandi (alcuni GB).

Ho provato due tecniche che utilizzano VC10 / VS2010 su Windows 7 a 64 bit:

  1. di memoria Win32 file (cioè CreateFile, CreateFileMapping, MapViewOfFile, ecc.) Mappato
  2. fopen e fread da CRT.

Ho pensato che la tecnica file di memoria mappata potrebbe essere più veloce di funzioni CRT, ma alcuni test hanno dimostrato che la velocità è quasi la stessa in entrambi i casi.

Le dichiarazioni dopo C ++ sono utilizzati per MMF:

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
    );

Il file viene letto in modo sequenziale, blocco per blocco; ogni blocco è SYSTEM_INFO.dwAllocationGranularity in termini di dimensioni.

Considerando che la velocità è quasi lo stesso con MMF e CRT, mi piacerebbe utilizzare funzioni CRT, perché sono più semplici e multi-piattaforma. Ma io sono curioso: sto utilizzando correttamente la tecnica MMF? E 'normale che le prestazioni MMF in questo caso di file di Scannig è in sequenza la stessa di CRT uno?

Grazie.

È stato utile?

Soluzione

credo che non vedrete molta differenza se si accede al file in modo sequenziale. A causa di file I / O è molto pesantemente cache, + read-ahead è probabilmente utilizzato anche.

La cosa sarebbe diversa se aveste molti "salti" durante l'elaborazione dei dati del file. Poi, ogni stabilendo un nuovo puntatore a file e la lettura di una nuova porzione di file tempo sarà probabilmente ucciderà CRT, mentre MMF vi darà il massimo delle prestazioni possibili

Altri suggerimenti

Dal momento che si sta effettuando la scansione il file in modo sequenziale non mi aspetto modello di utilizzo del disco ad essere molto diverso per entrambi i metodi.

Per i file di grandi dimensioni, MMF potrebbe ridurre località dei dati e addirittura provocare una copia di tutto o parte del file di essere immessi nel file di paging, mentre il trattamento con CRT con un piccolo tampone sarebbero tutti si svolgono in RAM. In questo caso, MMF sarebbe probabilmente più lento. Si può ovviare a questo da solo la mappatura in una parte del file sottostante in un momento, ma poi le cose si fanno più complesse, senza alcuna probabilità conquistare diretta sequenziale I / O.

MMF sono davvero il modo in cui gli attrezzi di Windows tra processi di memoria condivisa, piuttosto che un modo per accelerare il file generalizzata di I / O. La cache file manager nel kernel è quello che si ha realmente bisogno di leva qui.

  

ho pensato che la memoria di file mappato   tecnica potrebbe essere più veloce di CRT   funzioni, ma alcuni test hanno mostrato che   la velocità è quasi la stessa in entrambi   casi.

Probabilmente si sta colpendo la cache del file system per i test. A meno che non si crea esplicitamente handle di file al bypass cache del file system (FILE_FLAG_NO_BUFFERING quando si chiama CreateFile), cache del file system entreranno in gioco e mantenere i file accesso di recente nella memoria.

C'è una piccola differenza di velocità tra la lettura di un file che si trova nella cache di sistema di file con il buffering acceso, come il sistema operativo deve eseguire una copia in più, così come in testa chiamata di sistema. Ma per i vostri scopi, probabilmente si dovrebbe attaccare con le funzioni di file CRT.

Gustavo Duarte ha un grande articolo il file di memoria mappata (dal punto di vista generico OS).

Entrambi i metodi alla fine scendere a disco I / O, che sarà il vostro collo di bottiglia. Vorrei andare con un metodo che la mia funzionalità di livello superiore le piace di più -. Se ho bisogno di streaming, andrò con i file, se ho bisogno di accesso sequenziale e file di dimensioni fisse, vorrei prendere in considerazione i file mappati memoria

In alternativa, nel caso in cui si dispone di un algoritmo che funziona solo sulla memoria, i file allora mem-mapped può essere modo più semplice fuori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top