Отображенные в память файлы: IOException на CreateViewAccessor для больших данных - PullRequest
5 голосов
/ 04 сентября 2011

Я работаю с большими и растущими файлами, используя управляемые оболочки для файлов с отображением в памяти: 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 ГБ?

1 Ответ

3 голосов
/ 04 сентября 2011

Приложение действительно было настроено на целевую x86, а не x64 в конкретной конфигурации сборки проекта, которую я выбрал.

Я предполагаю, что мое адресное пространство процесса переполнилось, так как оно работало в 32-битном режиме.

Решение - измените целевую платформу на x64 и запустите на 64-битной ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...