2014-06-26 3 views
1

Lors de l'utilisation d'un fichier mappé en mémoire pour lire dans un flux de fichiers aussi rapidement que possible dans .net, j'ai rencontré le problème IOException s en raison du verrouillage de fichier avec deux processus lire le même fichier.Comment avoir un accès en lecture seule partagé à un fichier mappé en mémoire

Il existe plusieurs méthodes d'usine pour produire un fichier mappé en mémoire, comment autoriser l'accès partagé readonly?

+0

fichiers mappés en mémoire ne sont probablement pas la option la plus rapide disponible. Le streaming avec 'SequentialScan' est le moyen le plus rapide de lire des fichiers. – usr

+0

Eh bien, ce que j'utilise personnellement, c'est de le passer à un analyseur pour un format binaire qui ne lit pas nécessairement le fichier entier, donc ne pas avoir l'impression de gagner, je n'ai pas essayé le balayage séquentiel, mais à mes fins, le fichier mappé en mémoire par rapport à un fichier en lecture seule était plus rapide. – jbtule

Répondre

2

Voici une méthode de fabrication simplifiée pour la création d'un fichier mappé en mémoire en lecture seule à un chemin:

public static MemoryMappedFile MemFile(string path) 
{ 
    return MemoryMappedFile.CreateFromFile(
       //include a readonly shared stream 
       File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read), 
       //not mapping to a name 
       null, 
       //use the file's actual size 
       0L, 
       //read only access 
       MemoryMappedFileAccess.Read, 
       //not configuring security 
       null, 
       //adjust as needed 
       HandleInheritability.None, 
       //close the previously passed in stream when done 
       false); 

} 

Pour créer et utiliser le flux complet:

using (var memFile = MemFile(path)) 
using (var stream = memFile.CreateViewStream(0L, 0L, MemoryMappedFileAccess.Read)) 
{ 
    //do stuff with your stream 
} 
Questions connexes