Подтвердить что ты не робот

Когда использовать файлы с отображением памяти?

У меня есть приложение, которое получает фрагменты данных по сети и записывает их на диск. Как только все куски были получены, их можно декодировать/объединить в один файл, который они фактически представляют.

Мне интересно, полезно ли использовать файлы с отображением памяти или нет - сначала для записи одиночных фрагментов на диск, второй для одного файла, в который все они декодируются.

Мое собственное чувство состоит в том, что это может быть полезно только для второго случая, у кого есть идеи по этому поводу?

Изменить: Это приложение С#, и я планирую только версию x64. (Таким образом, проблема с "самым большим свободным пространством" не должна быть актуальной)

4b9b3361

Ответ 1

Файлы с отображением памяти полезны для сценариев, в которых требуется доступ к относительно небольшой части (виду) значительно большего файла.

В этом случае операционная система может помочь оптимизировать общее использование памяти и поведение пейджинга приложения путем подкачки входящих и выходящих только из последних используемых частей отображаемого файла.

Кроме того, файлы с отображением памяти могут выставлять интересные функции, такие как copy-on-write или служить основой для общей памяти.

Для вашего сценария файлы с отображением памяти могут помочь вам собрать файл, если куски выходят из строя. Тем не менее, вам все равно нужно заранее знать размер файла.

Кроме того, вы должны получать доступ к файлам только один раз, для написания фрагмента. Таким образом, преимущество производительности над явно реализованным асинхронным вводом-выводом маловероятно, но может быть проще и быстрее реализовать ваш файловый писатель правильно.

В .NET 4 Microsoft добавила поддержку файлов с отображением памяти, и есть несколько полных статей с образцом кода, например. http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx.

Ответ 2

Файлы с отображением памяти в основном используются для повышения производительности между процессами или повышения производительности ввода/вывода.

В вашем случае вы пытаетесь улучшить производительность ввода-вывода?

Ненавижу указывать на потворство, но Википедия дает хорошее изложение ситуации... http://en.wikipedia.org/wiki/Memory-mapped_file

В частности...

Подход с отображением памяти имеет свои затраты при незначительных ошибках страницы - когда блок данных загружается в кеш страницы, но еще не отображен в пространство виртуальной памяти процесса. В зависимости от обстоятельств файл ввода-вывода с отображением памяти может быть существенно медленнее, чем стандартный ввод/вывод файлов.

Похоже, вы собираетесь преждевременно оптимизировать скорость. Почему не обычный файловый подход, а затем рефакторинг для файлов MM позже, если это необходимо?

Ответ 3

Я бы сказал, что оба случая актуальны. Просто напишите одиночные куски в нужное место в файле с отображением памяти, не по порядку, поскольку они входят. Это, конечно, полезно, только если вы знаете, где каждый кусок должен идти, как в bittorrent загрузчике. Если вам нужно выполнить дополнительный анализ, чтобы узнать, куда должен идти кусок, преимущество файла с отображением памяти может быть не таким большим.