Dans certaines situations, la classe MemoryMappedViewAccessor
ne le coupe pas pour la lecture efficace des octets; le mieux que nous obtenons est le ReadArray<byte>
générique qui est la route pour toutes les structures et implique plusieurs étapes inutiles lorsque vous avez juste besoin d'octets.Comment puis-je lire rapidement des octets à partir d'un fichier mappé en mémoire dans .NET?
Il est possible d'utiliser un MemoryMappedViewStream
, mais comme il est basé sur un Stream
, vous devez d'abord rechercher la position correcte, puis l'opération de lecture elle-même comporte de nombreuses étapes inutiles. Existe-t-il un moyen rapide et performant de lire un tableau d'octets à partir d'un fichier mappé en mémoire dans .NET, étant donné qu'il ne doit s'agir que d'une zone particulière de l'espace adresse à lire?
Vous devriez utiliser un bloc d'exécution critique et un essai-final pour s'assurer que ReleasePointer s'exécute même si le Marshal.Copy lève une exception. –
Bonne réponse =) En effet, le profilage montre que l'encapsuleur géré est 30 fois plus lent que l'utilisation d'un pointeur non sécurisé pour accéder à la mémoire mappée. –
@MattHowells Je suis d'accord. J'ai lu que CER peut affecter la performance, mais il semble négligeable (dans un test contrôlé au moins). Indépendamment des implications de performance, c'est le modèle d'utilisation correct tel que décrit sous "remarques" ici; https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safebuffer.acquirepointer(v=vs.110).aspx – LaFleur