![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| alexpotemkin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Господа посоветуйте как максимально ускорить следующий процесс (на данный момент простой цикл, сборка списка файлов, потом обработка по списку): есть энное количество текстовых файлов (может и тысяча быть, а может и всего десяток), мне нужно их открыть (сейчас читаю в tstringlist), далее выполнить операции (замены, удаления), после сохранить файл.
Уместно ли использование потоков для ускорения процесса обработки? Уменьшит ли это время обработки? Что еще можно сделать для ощутимомго ускорения операций. При работе со строками (замены, удаления) использую функции из QStrings. Это сообщение отредактировал(а) alexpotemkin - 9.9.2008, 13:20 |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Ты бы не описал принцип работы, а код показал. А мы тебе его бы "ускорили"
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| alexpotemkin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
дабы не приводить весь код, примерно так все выглядит (обрежу для упрощения, обработчиков исключительных ситуаций тоже обрежу):
Это сообщение отредактировал(а) alexpotemkin - 9.9.2008, 14:21 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Грамотное использование потоков ускоряет работу, если разделить по потокам загрузку из файла и текстовую обработку. Т.е. полезным будет создание еще 2х потоков.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| alexpotemkin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Алексис, а можно чуть подробней?
|
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
alexpotemkin, конкретно по приведенному коду:
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| alexpotemkin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
txt вводил только ради ускорения работы с переменной, т.к. думал что обращение к переменной по определению будет быстрей чем обращение к list.Text.
По поводу рекомендаций: т.е. мне стоит в одном потоке собрать список, далее этот список разделить на двое и двумя потоками обработать замены. Правильно понял? Напомните линку на стутью по поводу потоков, здесь была, не могу найти. |
|||
|
||||
| Poseidon |
|
||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||
|
|||||
| alexpotemkin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
как тогда делить список между потоками, если еще первый находится в процессе работы, т.е. список еще не готов? спасибо за линк на статью |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Финт в том, что во время загрузки с винта, работает винт, а проц немного простаивает, в это время его можно пригрузить. Нужно делать что-то типа буферного массива файлов и создать 2 семафора. Как только файл прочитался первый семафор инкриметировался, а второй поток ждет семафора. Пока первый семафор не в нулевом состоянии WaitForSingleObject будет выполняться без задержки, если файлов нет то второй поток уснет. Еще понадобиться второй семафор, который изначально будет инициализирован числом элементов буферного массива. По мере заполнения массива 1й поток будет проходить через WaitForSingleObject и ждать второго семафора, с каждым проходом будет проходить декремент второго семафора, второй же поток по окончанию обработки своего текста будет сигнализировать второй семафор тем самым освобождая ячейку буферного массива.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Я бы начал с переработки алгоритма, а уж в последнюю очередь брался бы за потоки.
Теоретически, Alexeis говорит верно, но на практике прирост от таких изменений может быть перекрыт накладными расходами. Кроме того, реализовать всё правильно может быть весьма не просто. Поэтому лучше начать с алгоритма. С алгоритмом: Уверены, что здесь нет утечки? Далее: Зачем вы гоняете данные из списка в переменную и обратно? Выбросите список, грузите сразу в txt, а ещё лучше - используйте проекции файлов. Правда, в последнем случае вам понадобятся ещё и соответствующие варианты функций QReplace_Str, которые вместо String на вход принимают указатель + размер. Но если ваши искомые и заменяемые строки не соответствуют друг другу по длине, то от проекции придётся отказаться. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
CodeMonkey, прав тут оптимизировать и оптимизировать. Нужно заменять построчно, чтобы не гонять большие куски данных в памяти. Операция txt := list.Text; и list.Text := txt; занимает огромную кучу времени, а txt := QReplace_Str(txt,'шыло','мыло'); еще больше.
Добавлено через 5 минут и 36 секунд А вообще быстрее всего будет сразу загрузить текст в одну длинную строку, подсчитать число замен, выделить новую строку нужной длинны, затем копировать последовательно, сначала неизменный фрагмент, потом слово которое нужно заменить, потом опять неизменный и т.д. Каждое выделение памяти медленная операция. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 3 Всего: 32 |
Я бы вообще выкинула все list`ы к чертовой бабушке и работала с файлом как с цельным блоком данных.
Конечно придется повозиться, но 1. В этом нет ничего сложного - стандартные алгоритмы. 2. Выигрыш в быстродействии реален не в разы а на порядки. |
|||
|
||||
| Matematik |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 17 Всего: 50 |
> вообще быстрее всего будет сразу загрузить текст в одну длинную строку,
Ага Будет чуть быстрее
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |