| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > [оптимизация] Ускорение процесса. |
| Автор: Zorak 5.8.2011, 18:58 |
| Доброго времени суток. Задача стоит следущая. У файле есть примерно 5000 строк. Я открываю этот файл в мемо. Ищу нужные мне данные.... Точнее блок данных... это например из 450 до 1700 строки. Далее мне надо удалить ВСЕ строки ДО 450 и ПОСЛЕ 1700.. Вопрос таков: Как это можно сделать? З.Ы. Идти построчно и удалять memo1.Lines.Delete(index) происходит оооочень долго... так как данных очень много.... (примерно 400 файлов по 5000 строк каждый), а мне надо как то хоть чуточку быстрее... не считая удаления все процессы занимают примерно 8 минут... с прострочным удалением примерно 57 минут... Именно поэтому я хочу ускорить процес. Посоветуйте пжлста что нибудь)) Спасибо! |
| Автор: alexnef 5.8.2011, 20:15 |
| Удалить из memo или файла? Если из memo то легче их отсортировать и потом добавлять в memo. И желательно увидеть код. |
| Автор: Zorak 5.8.2011, 20:29 | ||||
Я работаю с текстом в мемо, который загруженный из файла, а после завершения работы все сохраняется в txt файл назад. Если сортировка будет менять местами строки - этого делать нельзя, положение строк важный елемент программы. Вот код который удаляет строки:
В данном случае nstring1 - это начало, тоесть ДО этого значения удаляются строки из начала файла, а nstring2 - это конец, тоесть удаляются ВСЕ строки ПОСЛЕ етого значения. |
| Автор: VictorTsaregorodtsev 5.8.2011, 21:29 |
| Zorak, ничего не удалять - а просто писать в файл строки с нужными номерами. Вместо memo2.Lines.SaveToFile() будет сначала создание TFileStream'а с нужным именем, потом в цикле построчная запись в него нужных строк, потом удаление (закрытие) этого стрима. Ведь вызываемый SaveToFile() делает именно это - создает файл, гонит цикл записи строк, закрывает файл. Поэтому вместо того, чтобы он по дефолту писал все строки из мемо - пишите нужные строки сами в "ручном" режиме, наплевав на имеющиеся в мемо лишние строки. Ну и м.б. доступ к Lines.Count на каждой итерации цикла может давать тормоза. По крайней мере, при работе с базами данных через VCL'ные объекты я предпочитаю считывать свойство RecordCount у TTable'a в локальную переменную и потом (в цикле бегания по строкам таблицы) сравнивать счетчик именно с этой локальной переменной. Может, get-функция для Lines.Count тоже реализована тормозно - проверьте, мне самому лень это уточнять. |
| Автор: k0rvin 5.8.2011, 22:17 | ||
как-то так, не? |
| Автор: Poseidon 6.8.2011, 12:32 |
| Zorak, тебе надо открыть файл, прочитать его весь, найти нужный блок, удалить все кроме этого блока и сохранить все обратно? Сделай по другому. Открой файл, найди нужный блок и сохрани его. И используй TStringList. |
| Автор: Zorak 6.8.2011, 13:04 | ||||||
Очень таки дельный совет. Спасибо большое. Помогло. Ускорилось во много раз... время сократилось с 57 минут до 20 секунд -=)))... Единственное это нарушился правильный отсчет нужных мне строк (тоесть nstring1 ищет правильно, а вот с nstring2 произошел сбой), но я не думаю что это большая проблема.... и единственное что у фиг-знает-во-сколько-больше времени увеличилось - это метод Replace в регулярных выражениях... тоесть это:
Содержимое memo2.Lines:
С memo ето работало примерно 0,01 секунды, а с StringList 0.9 секунды...(... Не могу понять почему еще пока что. |