Господа эксперты, поясните кто-нибудь следующий вопрос:
1. Создаем Persisted MemoryMappedFile длины 100 байт.
2. Вызываем у него CreateViewStream.
3. Смотрим длину полученного стрима, получаем 4096 байт.
Возникает вопрос — а как, собственно, определить реальную длину полученного потока?
Посмотрел рефлектором — данные 4096 байт выделяются, поле STATE структуры MEMORY_BASIC_INFORMATION имеет значение 0x2000,т.е. RESERVED.
Буду благодарен ответу на следующие вопросы:
1. Почему так получается.
2. Как получить реальную длину потока.
Заранее спасибо.
З.Ы. Саммоню в топик nikov, Jolly Roger и других экспертов
З.Ы.Ы. ViewStream создается с помошью CreateViewStream без параметров.
Здравствуйте, Codechanger, Вы писали:
C>Возникает вопрос — а как, собственно, определить реальную длину полученного потока?
Если коротко — практически никак, MMF заточен под fixed-size файлы и доступ в известных границах.
Самый простой способ — запоминать new FileInfo(filename).Length.
Я вас ещё больше обрадую. Угадайте, как себя ведёт код:
string filename = @"d:\123.txt";
File.WriteAllText(filename, "Hello!", Encoding.ASCII);
long length = new FileInfo(filename).Length;
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(filename, FileMode.Open))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
stream.Position = 5; // 5000;byte[] bytes = Encoding.ASCII.GetBytes(", world!");
stream.Write(bytes, 0, bytes.Length);
}
}
А при замене stream.Position = 5 на stream.Position = 5000?
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Codechanger, Вы писали:
C>>Возникает вопрос — а как, собственно, определить реальную длину полученного потока? S>Если коротко — практически никак, MMF заточен под fixed-size файлы и доступ в известных границах. S>Самый простой способ — запоминать new FileInfo(filename).Length.
S>Я вас ещё больше обрадую. Угадайте, как себя ведёт код: S>
S>А при замене stream.Position = 5 на stream.Position = 5000?
Я не понимаю что именно вам не нравиться в поведении данного кода. Данные классы используют в своей работе функции API CreateFileMapping/MapViewOfFile которые используя виртуальную память могут кусать участки только кратные страницам вирт. памяти. Т.е. в данном случае 4096 байт.
Вы использовали самый простой конструктор без указания возможной "capacity" и класс подставил в функцию CreateFileMapping значение параметра "Размер-файла" = 0, что значит использовать "capacity" по длине файла (но кратно страницам). Т.е. в данном случае опять же 4096 байт. Соответсвенно в рамках 4Кбайт вы можете писать что хотите, за ними, — извините, но адресов не выделенно.
Используйте более сложный конструктор и можете там указывать "capacity" какой захотите.
Здравствуйте, AngeL B., Вы писали:
AB>Я не понимаю что именно вам не нравиться в поведении данного кода.
Мне — всё нравится, это я топикстартера подбадриваю
А вот товарищей, привыкших исключительно к .NET-подходу "если я накосячу — фреймворк плюнет исключением", может неприятно обрадовать потеря 4095 бесценных байт. По-хорошему можно бы кидать ArgumentOutOfRangeException при попытки обращения за пределы реального размера файла, но один фиг mmf если и используются, то заворачиваются в какую-нибудь обёртку.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, AngeL B., Вы писали:
AB>>Я не понимаю что именно вам не нравиться в поведении данного кода. S>Мне — всё нравится, это я топикстартера подбадриваю
S>А вот товарищей, привыкших исключительно к .NET-подходу "если я накосячу — фреймворк плюнет исключением", может неприятно обрадовать потеря 4095 бесценных байт. По-хорошему можно бы кидать ArgumentOutOfRangeException при попытки обращения за пределы реального размера файла, но один фиг mmf если и используются, то заворачиваются в какую-нибудь обёртку.
Ну вот написанием обертки сейчас и занимаюсь. Просветите, кто умный — non-persistent файлы целиком в памяти хранятся или все же на диске?
Здравствуйте, Codechanger, Вы писали:
C>non-persistent файлы целиком в памяти хранятся или все же на диске?
В виртуальной памяти (могут быть спихнуты в своп). http://msdn.microsoft.com/en-us/library/dd997372.aspx
Non-persisted memory-mapped files
Non-persisted files are memory-mapped files that are not associated with a file on a disk. When the last process has finished working with the file, the data is lost and the file is reclaimed by garbage collection. These files are suitable for creating shared memory for inter-process communications (IPC).
Здравствуйте, Codechanger, Вы писали:
C>Ну вот написанием обертки сейчас и занимаюсь. Просветите, кто умный — non-persistent файлы целиком в памяти хранятся или все же на диске?
Данные non-persistent файлов храняться в свопе. Возможно полностью, возможно частично, возможно никогда туда не попадают, что зависит от количества свободной оперативки, состояния системы и контролироваться никак не может, т.к. относится к механизму страничного свопинга.
Более подробно читай у Sinix-а по ссылке в параллельном ответе.