Управление памятью - как и когда записывать большие объекты на диск - PullRequest
4 голосов
/ 17 октября 2010

Я работаю над приложением, которое потенциально способно к большой загрузке памяти (> 5 ГБ), но требует работы на 32-битных и .NET 2 настольных компьютерах из-за среды развертывания клиента. Мое решение до сих пор состояло в том, чтобы использовать хранилище данных в масштабе приложения для этих объектов большого объема, когда объект назначается хранилищу, хранилище проверяет общее использование памяти приложением и приближается ли оно к пределу. начнет сериализацию некоторых старых объектов в хранилище во временную папку пользователя, извлекая их обратно в память по мере необходимости. Это оказывается явно ненадежным, так как если другие объекты в приложении начинают использовать память, хранилище не имеет подсказки, чтобы очистить и освободить место. Я смотрел на использование слабых указателей для хранения объектов данных в памяти, когда они были сериализованы на диск после их освобождения, однако объекты, казалось, освобождались почти сразу, особенно при отладке, что приводило к значительному снижению производительности в приложении. сериализовал все.

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

Ответы [ 3 ]

4 голосов
/ 17 октября 2010

Я думал, Виртуальная память должен был помочь вам в этой ситуации?

В любом случае, кажется подозрительным, что вам действительно нужны все 5 ГБ данных в памяти в любой момент - вы не можете обрабатывать все эти данные в любой момент времени - по крайней мере, на том, что звучит как потребительПК.Вы не вдавались в подробности о своих данных, но что-то для меня пахнет, как будто сам объект плохо спроектирован в том смысле, что вам нужен весь набор, чтобы быть в памяти, чтобы работать с ним.Задумывались ли вы о том, чтобы попытаться разбить ваши данные на более разумные блоки, а затем выполнить некоторую упреждающую загрузку данных с диска непосредственно перед их обработкой?По сути, вы бы заплатили более стабильный компромисс производительности, но вы бы сократили свою текущую волнующую проблему.

2 голосов
/ 17 октября 2010

Может быть, вы выберете Управление отображенными в память файлами и посмотрите здесь .В .NET 2.0 вы должны использовать PInvoke для этих функций.Начиная с .NET 4.0 у вас есть эффективная встроенная функциональность с MemoryMappedFile .

Также взгляните на: http://msdn.microsoft.com/en-us/library/dd997372.aspx

Вы можете 'эффективно хранить 5 ГБ данных в памяти.У вас есть ограничение 2 ГБ на процесс в 32-битной ОС и ограничение 4 ГБ на 32-битный процесс в 64-битная Windows-on-Windows

У вас есть выбор:

  • Используйте Google Chrome (и FireFox 4) и поддерживайте части данных между процессами.Это может быть применимо, если ваше приложение запущено под 64-битной ОС, и у вас есть некоторые причины, чтобы оставить его 32-битным.Но это не так просто.Если у вас нет 64-битной ОС, мне интересно, где вы получите> 5 ГБ ОЗУ?

  • Если у вас 32-битная ОС, тогда любое решение будет основано на файлах.Когда вы пытаетесь сохранить данные в памяти (хотя мне интересно, как вы адресуете их в памяти под 32-битным и 2 ГБ на лимит процесса), ОС просто постоянно выгружает части данных (страницы памяти) на диск и восстанавливает их снова и снова, когда выдоступ к нему.Вы несете большие потери производительности и уже заметили это (я догадался по описанию вашей проблемы).Основная проблема ОС не может предсказать, когда вам нужны одни данные, а когда вам нужны другие.Таким образом, это просто попытка сделать лучше всего, читая и записывая страницы памяти на / с диска.

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

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

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

0 голосов
/ 17 октября 2010

Когда вам нужно хранить огромные объемы данных и поддерживать доступность, иногда наиболее полезным решением является использование хранилища данных и системы управления, такой как база данных.База данных (например, MySQL) может хранить множество типичных типов данных и, конечно, двоичные данные.Возможно, вы можете сохранить свой объект в базе данных (напрямую или путем программирования модели бизнес-объекта) и получить его, когда вам нужно.Это решение иногда может решить многие проблемы с управлением данными (перемещение, резервное копирование, поиск, обновление ...) и хранением (уровень данных) - и оно не зависит от местоположения - возможно, эта точка зрения может помочь вам.

...