Существуют ли какие-либо хорошие «шаблоны» разработки программного обеспечения для программ, интенсивно использующих память .net? - PullRequest
2 голосов
/ 15 января 2010

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

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

Я хочу максимально использовать возможности привязки данных WPF и MVVM, но если мне нужно взглянуть на другую архитектуру, я это сделаю.

Я просто ищу общие советы, советы, ссылки на статьи или что-нибудь, что может помочь.

Ответы [ 5 ]

3 голосов
/ 15 января 2010

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

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

Итак, вы хотите выбросить объекты, которые больше не нужны пользователю. Выяснить, какие объекты не нужны пользователю, может быть трудной задачей, но это также может быть так же просто, как предположить, что пользователю не нужен объект, который он использовал не так давно. Для этого вы используете наименее недавно использованный (LRU) кеш.

Это полностью соответствует шаблону MVVM. В вашем классе представления вы заставляете свой объект getter для объекта использовать этот псевдокод:

if object hasn't been loaded
    load object
add object to the LRU cache (whether you loaded it or not)
return object

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

Если при добавлении объекта очередь достигает своей емкости, она выскакивает из того, что находится в начале очереди (то есть того, который использовался не так давно), и вызывает событие DiscardingOldestItem.

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

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

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

3 голосов
/ 15 января 2010

Одна из вещей, на которую вы могли бы обратить внимание, - это виртуализация данных, которая не предусмотрена в WPF по умолчанию (вместо этого они предоставляют виртуализацию пользовательского интерфейса). Виртуализация данных может сказать «загрузить и связать данные для элемента / диапазона элементов, когда они видимы, а затем выгрузить, когда они не видны».

Вот отличная статья, которая описывает конкретную реализацию, которую вы можете использовать как есть или адаптировать:

http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx

1 голос
/ 15 января 2010

эта статья на informIt содержит много полезной информации по этому вопросу, хотя это больше c и c ++.

Статическая схема размещения: выделяет память заранее

Это предполагает, Шаблон распределения пула: предварительное распределение пулов необходимых объектов

Шаблон фиксированного размера буфера: выделяет память в блоках одинакового размера

Smart Pointer Pattern: делает указатели надежными

Шаблон сбора мусора: автоматически восстанавливает потерянную память

Шаблон для мусора: автоматически дефрагментирует и восстанавливает память

1 голос
/ 15 января 2010

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

0 голосов
/ 15 января 2010

«Я знаю, что могу лениво загружать изображения, но как только вы вернулись и вперед вы все застряли в память. "

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

Для тех, кто нашел этот вопрос в поисках общих шаблонов (не WPF) для уменьшения памяти, знаменитым (который я никогда не использовал!) Будет Шаблон Flyweight

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