2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
|
|
1 | |
Сборка мусора21.10.2011, 18:25. Показов 1835. Ответов 13
Метки нет (Все метки)
Здравствуйте.
Есть список, который постоянно пополняется новыми строчками. Строчек очень много дописывается где-то 100 строчек в секунду. Для программы необходимы только последние 2000 строчек. Как эффективнее всего удалять остальные, уже ставшие ненужными строчки чтобы избежать сборки мусора из-за ресайза списка?
0
|
21.10.2011, 18:25 | |
Ответы с готовыми решениями:
13
Сборка мусора Сборка мусора Сборка мусора Сборка мусора/ссылки |
Заблокирован
|
|
21.10.2011, 18:56 | 2 |
Самое эффективное не знаю.
Поставьте таймер раз в 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
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
21.10.2011, 22:02 | 8 | |||||
Список (тот, котрый List<T>) - очень шустрый класс, он может миллионы элементов добавлять/удалять за микросекунды.
Мне кажется, затор у вас где-то в другом месте. Простенький пример: в бесконечном цикле раз в 10 мсек (100 раз в секунду) добавляем строчки в список и проверяем на количество элементов. Если оно более 2000 - удаляем первый.
1
|
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
|
|
22.10.2011, 10:46 [ТС] | 9 |
kolorotur, скажите, пожалуйста, какой вариант лучше выбрать: тот, который Вы предложили в предыдущем посте (удалять по одной строчке) или, например, удалять range раз в 10 минут от 0 до count - 2000?
0
|
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 |
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
22.10.2011, 12:21 | 12 | |||||
1
|
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
|
|
22.10.2011, 12:35 [ТС] | 13 |
А что это даст? Если я правильно понял, список будет состоять из 2001 строчки. И в конец обработчика события я добавлю условие if(list.Count == 2001) list.RemoveAt(0);
Получается, что сто раз в секунду будет проверяться еще дополнительное условие. Разве не лучше делать это раз в 10 минут?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|||||||||||
22.10.2011, 12:56 | 14 | ||||||||||
Тут либо вы используете пару сотен лишних циклов на проверку, либо пару сотен лишних кб памяти на хранение ненужных элементов (256 кб, если сообщения добавляются строго 100 раз в секунду). Что вам больше подходит - это вы уже решаете сами, исходя из нужд приложения. И то и другое не является серьезным поводом для беспокойства, т.к. оверхед при этом - смешной, что по памяти, что по использованию ЦП. Опять же, я не знаю как у вас в программе используется этот список. Сколько потоков к нему обращаются одновременно, например. Если несколько, то при синхронизации лучше максимально уменьшить время, на которое каждый поток залочивает объект. В этом случае больше подходит вариант с периодической очисткой списка.
2
|
22.10.2011, 12:56 | |
22.10.2011, 12:56 | |
Помогаю со студенческими работами здесь
14
Сборка мусора вручную Очистка односвязного списка и сборка мусора Что значит сборка мусора в программе? Постоянная сборка мусора и как с ней бороться Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |