2009-12-07 2 views
40

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

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

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

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

+0

Хороший звонок, я отредактировал свое сообщение для разработки - это будет x64-единственное приложение. – Pygmy

+1

Какие преимущества вы думаете, используя MM-файл, даст вам? – 2009-12-07 10:52:50

+0

Не скорость обычно является основным преимуществом файлов mmap'ed? –

ответ

25

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

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

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

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

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

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

+4

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

+2

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

3

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

12

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

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

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

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

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

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

+2

Я нацелен на лучшую производительность ввода-вывода. Теперь я получаю около 12 МБ/сек данных (но в будущем это будет намного больше), и вам нужно будет обрабатывать его/записывать обратно на диск как можно быстрее. Я читал статью в Википедии, и я понимаю преимущества при чтении, но наилучшее использование и преимущества, когда * запись * в файлы не совсем ясна для меня, поэтому я прошу о помощи в ее понимании:) – Pygmy

Смежные вопросы