Question

Je dois lire (scan) d'un fichier séquentiel et de traiter son contenu. Taille du fichier peut être quelque chose de très petit (certains KB) à très grande (certains GB).

J'ai essayé deux techniques utilisant VC10 / VS2010 sur Windows 7 64 bits:

  1. Win32 mémoire mappée fichiers (à savoir CreateFile, CreateFileMapping, MapViewOfFile, etc.)
  2. fopen et fread du CRT.

Je pensais que la technique de fichier mis en correspondance de la mémoire pourrait être plus rapide que les fonctions CRT, mais certains tests ont montré que la vitesse est à peu près la même dans les deux cas.

Les déclarations de C suivantes sont utilisées pour 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
    );

Le fichier est lu séquentiellement, bloc par bloc; chaque bloc est SYSTEM_INFO.dwAllocationGranularity en taille.

Étant donné que la vitesse est à peu près la même chose avec MMF et CRT, j'utiliser des fonctions CRT parce qu'ils sont plus simples et multi-plateforme. Mais je suis curieux: j'utilise correctement la technique MMF? Est-il normal que la performance MMF dans ce cas de fichier scannig est successivement le même que celui d'un tube cathodique?

Merci.

Était-ce utile?

La solution

Je crois que vous ne verrez pas beaucoup de différence si vous accédez au fichier séquentiel. Parce que le fichier E / S est très fortement mis en mémoire cache, + lecture anticipée est probablement aussi utilisé.

La chose serait différente si vous avez eu beaucoup de « sauts » lors du traitement des données de fichier. Ensuite, chaque fois que la fixation d'un nouveau pointeur de fichier et la lecture d'une nouvelle portion de fichier sera probablement tuer CRT, alors que MMF vous donnera le meilleur rendement possible

Autres conseils

Puisque vous numérisez le fichier séquentiel je ne pense modèle d'utilisation du disque pour être différent beaucoup pour les deux méthodes.

Pour de gros fichiers, MMF pourrait réduire la localité des données et le résultat même dans une copie de tout ou partie du fichier étant placé dans le fichier d'échange, alors que le traitement par CRT en utilisant un petit tampon serait tout lieu dans la RAM prendre. Dans ce cas, MMF serait probablement plus lent. Vous pouvez atténuer ce par correspondance que dans une partie du fichier sous-jacent à un moment, mais les choses deviennent plus complexes sans victoire probable sur I séquentielle directe / O.

MMF sont vraiment la façon dont Windows implémente inter-processus mémoire partagée, plutôt que d'un moyen d'accélérer le fichier généralisé E / S. Le cache du gestionnaire de fichiers dans le noyau est ce que vous avez vraiment besoin de l'effet de levier ici.

  

Je pense que fichier mappé en mémoire   technique pourrait être plus rapide que CRT   fonctions, mais certains tests ont montré que   la vitesse est à peu près la même dans les deux   cas.

Vous frappez probablement le cache du système de fichiers pour vos tests. À moins que vous créez explicitement les descripteurs de fichiers pour contourner le cache du système de fichiers (FILE_FLAG_NO_BUFFERING lors de l'appel CreateFile), le cache du système de fichiers et lancera conserver les fichiers récemment utilisés dans la mémoire.

Il y a une petite différence de vitesse entre la lecture d'un fichier qui se trouve dans le cache du système de fichiers avec mise en mémoire tampon est activée, le système d'exploitation doit effectuer une copie supplémentaire, ainsi que les frais généraux d'appel système. Mais pour vos besoins, vous devriez probablement rester avec les fonctions de fichier CRT.

Gustavo Duarte a un grand article sur les fichiers de mémoire mappées (à partir d'un point de vue générique du système d'exploitation).

Les deux méthodes finiront par descendre sur le disque i / o, ce sera votre goulot d'étranglement. Je voudrais aller avec une méthode que ma fonctionnalité de niveau supérieur aime plus -. Si j'ai besoin de streaming, je vais aller avec des fichiers, si je dois accès séquentiel et les fichiers de taille fixe, je considérerais mémoire les fichiers mis en correspondance

Ou, dans le cas où vous avez un algorithme qui ne fonctionne que sur la mémoire, les fichiers mem-cartographié peut être moyen plus facile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top