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

StackOverflow https://stackoverflow.com/questions/1859213

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top