Il est difficile de répondre sans le code, la connaissance de votre mémoire principale et de votre architecture. Par conséquent je ne peux que deviner quelques pointeurs importants:
- Avez-vous assez de RAM? Directement, si vous faites référence à une adresse qui n'a pas encore été chargée dans la RAM, une erreur de page se produit dans les coulisses et lit les données dans la RAM pour vous. Votre programme ne remarque pas cette activité car votre thread est suspendu pendant le traitement de l'erreur de page. Bon article here.
- Un autre point important du même article - Vous n'avez aucun contrôle sur combien de MMF est conservé en mémoire ou pendant combien de temps. Cela signifie que l'utilisation d'un fichier MMF peut faire sortir d'autres éléments de la RAM, tels que du code ou des pages de données dont vous aurez besoin "bientôt". Cela entraîne une exécution plus lente. Je tiens particulièrement à pointer toute personne lisant cette réponse à another answer here, de sorte que nous avons une idée claire de la façon dont lente cette lenteur est en termes de cycles de processeur.
- Ensuite, vous créez un flux. Streams bon pour l'accès séquentiel pendant que vous pourriez être en train d'essayer de lire/écrire au hasard.
En ce qui concerne la course de bout en bout le temps de votre code dans FileStream vs approche MMF, je pense que vous devriez exécuter les tests à nouveau parce que l'exécution de votre première approche pourrait résultat dans un cache réchauffé pour la deuxième un. Les résultats ne seront pas corrects alors.
Selon le MSDN documentation of MMF,
fichiers mappés en mémoire permettent aux programmeurs de travailler avec de très grands fichiers parce que la mémoire peut être géré en même temps, et ils permettent un accès complet, aléatoire dans un fichier sans avoir besoin de cherchant.
La façon dont fonctionne le MMF est que l'ensemble (ou une partie) du fichier est mappé en tant que mémoire virtuelle, qui est recherchée dans et hors de la mémoire par le système d'exploitation transparente que vous accéder aux portions du fichier.C'est pourquoi les fichiers MMF sont bons pour travailler avec des fichiers volumineux en premier lieu.
Vous pouvez être plus intelligent et lire une partie de l'ensemble du dossier et effectuer un accès aléatoire en utilisant:
using (var accessor = mmf.CreateViewAccessor(offset, length))
{
//Here you have access to a specific part of the file
}
afin que vous ayez accès à une vue avec décalage spécifié et la taille, de votre fichier mammouth de cartographie de la mémoire.
Où se trouve le fichier? –
sur un lecteur ssd local – Sebastian
Avez-vous besoin de la vue sur l'ensemble du fichier? Sinon, essayez de créer la vue sur la partie requise en passant un offset et une longueur - 'using (var accessor = mmf.CreateViewAccessor (décalage, longueur))' – displayName