![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ограничение нагрузки на CPU [D7, WinXP]
Morphin © (2004-07-29 13:13:00)Как мне позволить программе использовать процессор не на всю катушку, а только некоторую его часть (например 50%). Во время , скажем, загрузки пару десятков тысяч сторок в TStringList.
Sulimxar (2004-07-31 00:27:00) [1]Кое что есть в статейке на этом же сайте. Способствует пониманию подобных вопросов:
http://delphimaster.ru/articles/dyntable/index.html
А вот кстати почему память освобождается при сворачивании? Сбрасывется с оперативки на винт?
panov (2004-07-30 13:51:00) [2]Смотря по задаче, опять же.
Если выгода от удобства использования TStringList превышает потери от большого использования ресурсов, то почему бы и не использовать.
При ОЧЕНЬ больших объемах придется часть данных держать на диске, а в память загружать нужные данные.
Здесь подойдут и динамические масивы, отображение файла в память...
Morphin (2004-07-30 13:34:00) [3]Ну допустим мне нужно очень часто удалять и добавлять строки. И в чем мне их хранить, чтоб удобнее было это делать. И кстати говоря, в TStringList'e в моем может быть и было более 2 млн строк. Все работает ОК, но как вижу - это есть хорошо. Где бы вы мне посоветовали хранить столько данных?
panov (2004-07-30 10:58:00) [4]>Игорь Шевченко © (30.07.04 10:34) [9]
Это точно.
Всему свое место и время.
Игорь Шевченко (2004-07-30 10:34:00) [5]panov © (29.07.04 16:54) [7]
> У меня без напрягов обрабатываются десятки тысяч записей
От "без напрягов" это не перестает быть извращением. Загрузить N тысяч строк в StringList я полагаю, не является самоцелью, не так ли ? С этими строками нужно что-то делать потом, иначе зачем их грузить вообще ?
False_Delirium (2004-07-29 17:38:00) [6]Morphin для работы с таким кол-вом элементов нужно проводить обязательную оптимизацию... в зависимости от задачи.
Если ты посмотришь в исходный код TList`а то увидишь в классе внутренний метод Grow. Нассколько я помню без исходного кода он вызывается при приближении фактического количества элементов, к количеству элементов в распределённой заранее памяти. И это число варируется в зависимости от кличества уже имеющихся элементов, при малом количестве добавлется по 4, больше - по 8, больше - 16... если я не ошибаюсь, то 16 - это максимум. В части от постоянного перераспределения памяти страдает скорость.
Можно догадаться, что при большом кол-ве элементов необходимо определить барьер в 500 или 1000(можно конечно и больше)...и по окончанию перераспределить по количеству занятой памяти и отсечь лишнее.
Придётся написать класс свой. Если ты собираешься работать с элементами класса с частым удалением или и другими манипуляциями, требующими перераспределения памяти, то необходимо перерисать общий менеджер памяти, который будет создавать твои версии TSTringList`ов для каждых 10000(чем меньше, тем лучше) элементов... и в одном своём свойстве будет обрабатывать общий индекс, вычислять в каком листе находится и брать или класть элемент в этот список.
Так же это позволит обрабатывать строки в разных потоках, количеством равным количеству эксземпляров твоих TStringList`ов одновеременно.
Надеюсь ясно подал идею.:)
panov (2004-07-29 16:54:00) [7]>Игорь Шевченко © (29.07.04 16:52) [6]
У меня без напрягов обрабатываются десятки тысяч записей.
Вот если нужно после загрузки достаточно много удалять/добавлять строки в TStringList, тогда логику менять приходится...
Игорь Шевченко (2004-07-29 16:52:00) [8]
> Не только несколько десятков тысяч, но и несколько сотен
> тысяч - не извращение.
Извращение :)
Anatoly Podgoretsky (2004-07-29 14:54:00) [9]У тебя мало памяти, у тебя не рациональный механизм использования TStringList, у тебя выбран неверное хранилище у TStringList большой overhead. Храни строки или в динамическом массиве (уменьшит потребность в памяти) и/или используй более рациональное управление для TStringList и для массива тоже самое.
Morphin (2004-07-29 14:29:00) [10]2 panov ©
> Не помогло в каком смысле?
В том, что если загружаешь в TValueListEditor (св-во Strings = TStrings) например 3000 строк - то все ОК - проц - не напрягается и делает это быстро и не кушает ОЗУ. А если добавлют например 10000 строк, то происходят ужасные вещи!! Процессор (атлон 1700+) напрягается до 100%, что ОЧЕНЬ тормозит процесс загрузки этих строк!! Чем больше строк - тем все медленно! Кардинально медленнее. + ко всему изложенному при загрузке 10000 строки - прога "съедает" около 100 Мб ОЗУ!! Что совсем не есть хорошо. И еще заметил прикольную вещь - если после загрузки их окно минимизировать, то память опять восстанавливается...
panov (2004-07-29 14:18:00) [11]>N170 (29.07.04 13:24) [1]
Не только несколько десятков тысяч, но и несколько сотен тысяч - не извращение.
>Morphin (29.07.04 14:15) [2]
Я пробовал изменять приориет текущего потока - не помогло.
Не помогло в каком смысле?
Morphin (2004-07-29 14:15:00) [12]Я пробовал изменять приориет текущего потока - не помогло.
> Лучше придумать более рациональный алгоритм для обработки ваших данных.
например?
N170 (2004-07-29 13:24:00) [13]Загружать в отдельном потоке с idle - приоритетом.
Не забыть сделать правильную синхронизацию.
Но, вообще, несколько десятков тысяч строк в TStringList - imho, изврашщение.
Лучше придумать более рациональный алгоритм для обработки ваших данных.