Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

Страшные тормоза при работе программы.   Найти похожие ветки 

 
Pavelkq   (2004-07-15 09:47) [0]

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


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

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


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


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

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


 
begin...end ©   (2004-07-15 10:14) [3]

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


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

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


 
begin...end ©   (2004-07-15 10:20) [5]

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


 
Romkin ©   (2004-07-15 12:14) [6]

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


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

[6] Romkin ©   (15.07.04 12:14)

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


 
Anatoly Podgoretsky ©   (2004-07-15 12:22) [8]

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


 
Sandman25 ©   (2004-07-15 12:24) [9]

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

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


 
©   (2004-07-15 14:59) [10]

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


 
Pavelkq   (2004-07-15 15:20) [11]

Что же если виноват код, т.е. я, то хотел бы углубиться в решение проблемы. Каждая итерация разбита на самостоятельные блоки, что и проще программировать и устойчивее к сбоям.
Алгоритм следующий:
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 работал не корректно.
 А теперь давайте, какие тут косяки?


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

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


 
Anatoly Podgoretsky ©   (2004-07-15 16:05) [13]

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.037 c
3-1089358855
==x==
2004-07-09 11:40
2004.08.01
Ado-dBase не работает после переустановки системы


3-1089033398
RainKM
2004-07-05 17:16
2004.08.01
Бази Даных


1-1090240503
Комбинатор
2004-07-19 16:35
2004.08.01
Можно ли заблокировать ShowMessage.


1-1089707283
Shc
2004-07-13 12:28
2004.08.01
Как сделать инспектор объектов?


1-1089962162
BillyJeans
2004-07-16 11:16
2004.08.01
Ширина шрифта в точках...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский