Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1093514540
Garry
2004-08-26 14:02
2004.09.12
Скопировать лист в книге Excel


4-1091037512
Forelli
2004-07-28 21:58
2004.09.12
Как получить доступ к системным переменным Windows?


1-1093422135
Borion
2004-08-25 12:22
2004.09.12
Программная смена размера бумаги


6-1088953466
начинающий
2004-07-04 19:04
2004.09.12
Остановка TIdTCPServer


1-1093525656
AlexXn
2004-08-26 17:07
2004.09.12
Тэги HTML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский