Я работаю с большими и растущими файлами, используя управляемые оболочки для файлов с отображением в памяти: MemoryMappedFile
, MemoryMappedViewAccessor
.
Я создаю пустые файлы, используя этот код:
long length = 1024L * 1024L * 1L; // 1MB
// create blank file of desired size (nice and quick!)
FileStream fs = new FileStream(filename, FileMode.CreateNew);
fs.Seek(length, SeekOrigin.Begin);
fs.WriteByte(0);
fs.Close();
// open MMF and view accessor for whole file
this._mmf = MemoryMappedFile.CreateFromFile(filename, FileMode.Open);
this._view = this._mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.ReadWrite);
Это прекрасно работает, до 1 ГБ.Когда я пробую 2 ГБ, я получаю IOException
:
Not enough storage is available to process this command.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.MemoryMappedFiles.MemoryMappedView.CreateView(SafeMemoryMappedFileHandle memMappedFileHandle, MemoryMappedFileAccess access, Int64 offset, Int64 size)
at System.IO.MemoryMappedFiles.MemoryMappedFile.CreateViewAccessor(Int64 offset, Int64 size, MemoryMappedFileAccess access)
at (my code here)
У меня 64-разрядная версия Windows 7, приложение работает как 64-разрядная, у меня 6 ГБ ОЗУ.Все это должно быть неактуально, насколько я могу судить, хотя.Это большие объемы данных, да, однако, насколько я понимаю, MemoryMappedFile
и связанные с ними классы - это способ обработки больших объемов данных, подобных этому.
Согласно документации, http://msdn.microsoft.com/en-us/library/dd267577.aspx, IOException буквально означает «Произошла ошибка ввода-вывода».Тем не менее, файл на диске просто отлично.
Приложение регулярно увеличивает размер файла по мере необходимости, как уже упоминалось, и на самом деле ошибка возникает в какой-то момент довольно случайно между ~ 400 МБ и ~ 2 ГБ.При запуске с 1 ГБ это всегда успешно.При запуске с размером по умолчанию 1 МБ происходит сбой гораздо раньше, возможно, из-за освобождения и перераспределения ресурсов.(У меня всегда Flush
и Close
для вида, MMF и и потоков).
Мне нужен произвольный доступ ко всему диапазону данных.Я надеюсь, что мне не нужно динамически поддерживать словарь объектов MemoryMappedViewAccessor
- моя интерпретация используемой здесь системы виртуальной памяти предполагает, что страницы из файла любого размера будут выгружаться и выгружаться по мере необходимости из памятисистема в Windows.
В форме вопроса: почему это происходит?Как я могу это остановить?Есть ли лучший способ получить полный произвольный доступ для чтения и записи к файлам любого размера?Например, до 100 ГБ?