Главная страница
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.038 c
1-1093542362
hgd
2004-08-26 21:46
2004.09.12
Управление фотоаппаратом


4-1091029105
Anik
2004-07-28 19:38
2004.09.12
Как достать из JPEG Exif через Windows API?


8-1087928833
Larrr
2004-06-22 22:27
2004.09.12
Как одновременно проиграть wav-file и прогнать процесс?


6-1089095767
andrey__
2004-07-06 10:36
2004.09.12
RasApi - запуск удал. подключ. из TServiceApplication


3-1092716386
leonidus
2004-08-17 08:19
2004.09.12
Не полное отображение содержимого таблицы