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