C #: управление большими буферами памяти - PullRequest
4 голосов
/ 07 марта 2011

Я поддерживаю видео приложение, написанное на C #.Мне нужно как можно больше контроля над распределением / освобождением памяти для больших буферов памяти (сотни мегабайт).

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

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

1 голос
/ 07 марта 2011

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

Когда вы закончите с конкретным блоком, вы можете самостоятельно заставить GC. Это звучит как разумное использование API GC.Collect - вы сделали с использованием огромной части всей доступной памяти.

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

1 голос
/ 07 марта 2011

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

Так что я бы предпочел реализовать ручной пул для растровых массивов или даже использовать неуправляемую память. Иметь некоторый класс пула и вернуть массив обратно в Dispose вашего класса пикселей / растрового изображения.

...