En algunas situaciones, la clase MemoryMappedViewAccessor
simplemente no se corta para leer bytes de manera eficiente; lo mejor que obtenemos es el genérico ReadArray<byte>
que es la ruta para todas las estructuras e implica varios pasos innecesarios cuando solo necesitas bytes.¿Cómo puedo leer rápidamente los bytes de un archivo mapeado en memoria en .NET?
Es posible utilizar un MemoryMappedViewStream
, pero debido a que se basa en un Stream
primero debe buscar la posición correcta, y luego la operación de lectura tiene muchos más pasos innecesarios.
¿Hay una forma rápida y de alto rendimiento de leer una matriz de bytes desde un archivo mapeado en memoria en .NET, dado que solo debe ser un área particular del espacio de direcciones para leer?
Debería estar utilizando un Bloque de ejecución crítica y, finalmente, para asegurarse de que ReleasePointer se ejecuta incluso si Marshal.Copy arroja una excepción. –
Buena respuesta =) De hecho, los perfiles muestran que el contenedor gestionado es 30 veces más lento que el uso de un puntero inseguro para acceder a la memoria asignada. –
@MattHowells Estoy de acuerdo. Leí que CER podría afectar el rendimiento, pero parece insignificante (al menos en una prueba controlada). Independientemente de las implicaciones de rendimiento, es el patrón de uso correcto que se describe en "comentarios" aquí; https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safebuffer.acquirepointer(v=vs.110).aspx – LaFleur