Нюансы MemoryMappedFiles в .Net
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.01.20 08:34
Оценка: 4 (1)
Привет, коллеги.
Кто разобрался, как правильно работать в современном Core.Net с MMF?
Ну, то есть очевидная идея: есть MMF в винде. Есть их официальная поддержка в дотнете.
С другой стороны, у нас тут теперь есть модный API по allocation-free работе с памятью, в виде Span<T> и прочих его друзей из System.Memory.
И вот тут у меня затык: как подружить одно с другим?
Предположим примитивный случай: у меня есть полностью unmanaged структура. Например, long.
И есть файл размером в 10GB, целиком покрытый экземплярами этой структуры.
Я хочу работать с этим файлом в терминах Span<long>/ReadOnlySpan<long>.
Проблема номер 1: даже для того, чтобы добраться до указателя, который можно было бы скормить в конструктор спана, мне приходится делать неприличные unsafe-приседания типа AcquirePointer()
Проблема номер 2: я так и не понял, а как вообще пользоваться MMF в терминах прямых указателей? Решительно неясно, в какой момент надо вызывать ReleasePointer — см. https://stackoverflow.com/questions/52576962/what-is-the-correct-way-to-dispose-of-safememorymappedviewhandle-when-acquirepoi
Ответ там меня реально анноит: "You cannot make this safe, so no real point in trying."

Мне казалось, что решения со Span<T> и прочим должны уметь обеспечивать нужную безопасность.
Может, всё же можно накрутить какую-то ref struct вокруг MemoryMappedViewAccessor так, чтобы он мог отдавать Span<> для работы ниже по стеку?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.