Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Ограничение нагрузки на 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 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
14-1092977204
Рамиль
2004-08-20 08:46
2004.09.12
Ведение реестра акционеров эмитентом


14-1092970149
Думкин
2004-08-20 06:49
2004.09.12
С днем рождения! 20 августа


11-1080499633
nester
2004-03-28 22:47
2004.09.12
Как в рантайм у EditBox а добраться до свойства Options ?


14-1092645916
КаПиБаРа
2004-08-16 12:45
2004.09.12
Лоббирование и программирование


11-1080548358
Boris Mouradov
2004-03-29 12:19
2004.09.12
MHFontDialog - initfont