Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
1

Сборка мусора

21.10.2011, 18:25. Показов 1835. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Есть список, который постоянно пополняется новыми строчками. Строчек очень много дописывается где-то 100 строчек в секунду. Для программы необходимы только последние 2000 строчек.
Как эффективнее всего удалять остальные, уже ставшие ненужными строчки чтобы избежать сборки мусора из-за ресайза списка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2011, 18:25
Ответы с готовыми решениями:

Сборка мусора
Синтаксис C# предлагает синонимичную конструкцию для автоматического вызова метода Dispose -...

Сборка мусора
Рассмотрим следующий случай. В программе было создано два объекта разных классов. Причем первый...

Сборка мусора
Всем доброго времени суток. Подскажите. Как часто приходится писать деструкторы, реализовать...

Сборка мусора/ссылки
Делаю задачу по алгоритмам (Связной список , удалить все узлы с определенным значением). Для...

13
Заблокирован
21.10.2011, 18:56 2
Цитата Сообщение от 4dimuser Посмотреть сообщение
Как эффективнее всего удалять остальные, уже ставшие ненужными строчки чтобы избежать сборки мусора из-за ресайза списка?
Самое эффективное не знаю.

Поставьте таймер раз в 1-5 секунды проверять количество строк в списке.
Если количество больше на N строк, то в цикле от 0 до N удаляем нулевую строку.
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
21.10.2011, 19:22  [ТС] 3
Это я уже и сам догадался. Вопрос именно в том как сделать тоже самое с минимальной нагрузкой на проц.
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
21.10.2011, 19:52 4
При RemoveRange вообще ресайза нету как бы, просто копируется нужное кол-во в начало
короче нагрузка и так минимальная
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
21.10.2011, 20:32  [ТС] 5
Значит по таймеру RemoveRange. И ничего лучше не придумать?
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
21.10.2011, 20:36 6
А что настолько серьезные проблемы с производительностью? Грузит > 50% постоянно?
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
21.10.2011, 20:44  [ТС] 7
Грузит по 40% два ядра. Еще два ядра около нуля.
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
21.10.2011, 22:02 8
Цитата Сообщение от 4dimuser Посмотреть сообщение
Грузит по 40% два ядра. Еще два ядра около нуля.
Список (тот, котрый List<T>) - очень шустрый класс, он может миллионы элементов добавлять/удалять за микросекунды.
Мне кажется, затор у вас где-то в другом месте.

Простенький пример: в бесконечном цикле раз в 10 мсек (100 раз в секунду) добавляем строчки в список и проверяем на количество элементов. Если оно более 2000 - удаляем первый.
C#
1
2
3
4
5
6
7
8
List<string> list = new List<string>();
 
while (true) {
    list.Add("Hello! This is a very very very long and completely meaningless string that is created just to fill up some precious space");
    if (list.Count > 2000)
        list.RemoveAt(0);
    Thread.Sleep(10);
}
Запускаем, смотрим нагрузку на проц. Ее нет.
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
22.10.2011, 10:46  [ТС] 9
kolorotur, скажите, пожалуйста, какой вариант лучше выбрать: тот, который Вы предложили в предыдущем посте (удалять по одной строчке) или, например, удалять range раз в 10 минут от 0 до count - 2000?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
22.10.2011, 11:25 10
4dimuser, я бы удалял по одной строчке, т.к. если нужно максимум 2000 последних записей, нет смысла хранить в памяти всякий хлам.
Более того, если вы инициализируете список с параметром 2001, то удаляя по одной записи, мы еще и устраним последующую фрагментацию памяти.
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
22.10.2011, 12:14  [ТС] 11
Цитата Сообщение от kolorotur Посмотреть сообщение
инициализируете список с параметром 2001, то удаляя по одной записи, мы еще и устраним последующую фрагментацию памяти.
Как это сделать, можете подробнее написать?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
22.10.2011, 12:21 12
C#
1
List<string> list = new List<string>(2001);
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
22.10.2011, 12:35  [ТС] 13
А что это даст? Если я правильно понял, список будет состоять из 2001 строчки. И в конец обработчика события я добавлю условие if(list.Count == 2001) list.RemoveAt(0);
Получается, что сто раз в секунду будет проверяться еще дополнительное условие. Разве не лучше делать это раз в 10 минут?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
22.10.2011, 12:56 14
C#
1
А что это даст?
Более эффективное использование памяти.

C#
1
Если я правильно понял, список будет состоять из 2001 строчки
Нет, при иницализации список запросит у ОС памяти на 2001-у ссылку.

Цитата Сообщение от 4dimuser Посмотреть сообщение
Получается, что сто раз в секунду будет проверяться еще дополнительное условие. Разве не лучше делать это раз в 10 минут?
Тут либо вы используете пару сотен лишних циклов на проверку, либо пару сотен лишних кб памяти на хранение ненужных элементов (256 кб, если сообщения добавляются строго 100 раз в секунду). Что вам больше подходит - это вы уже решаете сами, исходя из нужд приложения. И то и другое не является серьезным поводом для беспокойства, т.к. оверхед при этом - смешной, что по памяти, что по использованию ЦП.
Опять же, я не знаю как у вас в программе используется этот список.
Сколько потоков к нему обращаются одновременно, например. Если несколько, то при синхронизации лучше максимально уменьшить время, на которое каждый поток залочивает объект. В этом случае больше подходит вариант с периодической очисткой списка.
2
22.10.2011, 12:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2011, 12:56
Помогаю со студенческими работами здесь

Сборка мусора вручную
Можно ли принудительно собирать мусор вручную? Как я понимаю можно с помощью GC.Collect, а если...

Очистка односвязного списка и сборка мусора
https://metanit.com/sharp/algoritm/2.1.php Почему метод Clear описан так: public void...

Что значит сборка мусора в программе?
Как это работает?

Постоянная сборка мусора и как с ней бороться
Здравствуйте. Помогите полауйста: пишу небольшую игру (змейку, наверное уже всем надоел с ней),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru