Я знаю, что это старый вопрос, на который дан ответ, но я хотел добавить свои два цента.
Я выполнил тест как с принятым ответом (с использованием небезопасного кода), так и с подходом MemoryMappedViewStream длячтение байтового массива 200 МБ.
MemoryMappedViewStream
const int MMF_MAX_SIZE = 209_715_200;
var buffer = new byte[ MMF_VIEW_SIZE ];
using( var mmf = MemoryMappedFile.OpenExisting( "mmf1" ) )
using( var view = mmf.CreateViewStream( 0, buffer.Length, MemoryMappedFileAccess.ReadWrite ) )
{
if( view.CanRead )
{
Console.WriteLine( "Begin read" );
sw.Start( );
view.Read( buffer, 0, MMF_MAX_SIZE );
sw.Stop( );
Console.WriteLine( $"Read done - {sw.ElapsedMilliseconds}ms" );
}
}
Я выполнил тест 3 раза с каждым подходом и получил следующее время.
MemoryMappedViewStream:
- 483мс
- 501мс
- 490мс
Небезопасный метод
- 531мс
- 517 мс
- 523 мс
Из небольшого количества испытаний похоже, что MemoryMappedViewStream
имеет очень небольшое преимущество.Имея это в виду для тех, кто читает этот пост в будущем, я бы пошел с MemoryMappedViewStream
.