Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Страшные тормоза при работе программы. [D6, WinXP]


Pavelkq ©   (2004-07-15 09:47:00) 

Написал программу, которая выполняется довольно долго (несколько часов). В основном это циклы по вызову функций из внешнего DLL и свяческой сортировки в массивах.
 При работе программы, работать с компом практически нельзя. Все жутко тормозит. Проц загружен на 80-90%. Про форму я тоже молчу, т.к. она просто висит, до самого конца программы.
 Чего это такое, как с этим боротся?


Anatoly Podgoretsky   (2004-07-15 16:05:00) [1]

Постоянная пересылка туда сюда много раз, с постоянным выделением памяти и копированием.
Надо пересматривать алгоритм


Владислав   (2004-07-15 15:37:00) [2]

А не лучше ли дубликаты считать еще на этапе разбора файла на слова? И вроде как стринг лист останется один.


Pavelkq   (2004-07-15 15:20:00) [3]

Что же если виноват код, т.е. я, то хотел бы углубиться в решение проблемы. Каждая итерация разбита на самостоятельные блоки, что и проще программировать и устойчивее к сбоям.
Алгоритм следующий:
1. Открывется документ в ворде.
2. Весь документ копируется в переменную, после чего ворд тут же закрывется.
3. Запускается цикл равный количеству символов вышеуказанной переменной. Задача этого цикла разбить переменную на отдельные слова по аналогии с тем, как это делает сам ворд (его функцию я не использую по причине ее тормозов в экспоненциальной прогрессии), разбитые символом #13. Иногда попадаются тексты очень крупные в несколько мегабайт. Естественно это тормоза, но быстрее чем вечность самого ворда.
4. Создается TStringList, в который запихивается данная переменная. (Очень удобно, что не надо самому разбивать на слова и пихать все это в массив.)
5. Теперь данный TStringList циклом переносится в обычный массив и освобождается.
6. В цикле происходит замена всех слов массива на нормализованные слова с помьщью DLL. (Надо отметить, что это самая быстрая часть программы.)
7. Открывается файл результатов (если нет, то создается) типа:

   type TIndex=record
       Lema : string[50];
       Index : Integer;

и все из него сыитывается в соответствующий массив.
8. Массив из п6. снова заносится в TStringList c удалением пустых строк.
9. TStringList сортируется.
10. Идет удаление дубликатов слов с подсчетом их количества. Все это заносится в массив типа TIndex (вышеуказанный).
11. Массив, полученный из файла в цикле и массив с результата обработки сумируются в TStringList и тут же сортируются.
(Надо отметить, что пришлось в TStringList пихать и Index каждого слова с помощью IntToStr).
12. Далее снова поиск дубликатов, но немного другой. Если дубликат есть, то их Index суммируется. Результаты тут же заносятся в массив типа TIndex. (тут снова геморой с Indexом, т.к. при сравнении его учитывать не надо).
13. Результат пересохраняется в файле.
14. Переходим к следующему вордовскому файлу.
 Вот такая петрушка. В рузультате в файле получается частотны словарь слов.
 Хочу отметить, что массив п.5 и п.8 создаются не случайно. Из TStringLista DLL работал не корректно.
 А теперь давайте, какие тут косяки?


R   (2004-07-15 14:59:00) [4]

Поэтапно оптимизируй
имеющийся код, заменяя определенные тормозные моменты.
Для начала разбей программу на блоки проверки времени выполнения,
и начинай по итогу анализа оптимизацию.


Sandman25   (2004-07-15 12:24:00) [5]

[8] Anatoly Podgoretsky ©   (15.07.04 12:22)

Точно. Заодно реализовать и функциональность вызываемой DLL - может, это она так тормозит.


Anatoly Podgoretsky   (2004-07-15 12:22:00) [6]

Программу с исходниками стереть и переписать все нафиг


Sandman25   (2004-07-15 12:17:00) [7]

[6] Romkin ©   (15.07.04 12:14)

Если приоритеты понизить, будет несколько дней работать :)
Если постоянно происходит пересортировка масссивов, то нужно было использовать список.


Romkin   (2004-07-15 12:14:00) [8]

Дополнительный поток вряд ли поможет :))
А вот приоритеты понизить - можно.
Но я бы точно посмотрел, а что так долго-то?! Сортировка массива даже в гигабайт величиной идет очень быстро ;)


begin...end   (2004-07-15 10:20:00) [9]

Короче, чтение книги "Алгоритмы + структуры данных = программы" :-)


Sandman25   (2004-07-15 10:17:00) [10]

4. Перепроектирование структур данных? :-)


begin...end   (2004-07-15 10:14:00) [11]

3. Улучшение алгоритма ? :-)


begin...end   (2004-07-15 10:12:00) [12]


> Про форму я тоже молчу, т.к. она просто висит, до самого конца программы.

1. Поток ?
2. Application.ProcessMessages ?


Sergey Kaminski   (2004-07-15 09:58:00) [13]

Не нужно с этим бороться. Плюнь. Ничего не выйдет. Очень серьезная ошибка.


Наверх

Титульная страница Поиск, карта сайта Написать письмо