Форум: "Основная";
Текущий архив: 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 - может, это она так тормозит.
← →
R © (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.48 MB
Время: 0.039 c