Когда использовать отображенные в память файлы? - PullRequest
43 голосов
/ 07 декабря 2009

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

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

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

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

Ответы [ 3 ]

27 голосов
/ 07 декабря 2009

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

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

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

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

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

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

12 голосов
/ 07 декабря 2009

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

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

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

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

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

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

3 голосов
/ 07 декабря 2009

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

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