Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(alexnef @ 5.8.2011,  20:15)
Удалить из memo или файла? Если из memo то легче их отсортировать и потом добавлять в memo.
И желательно увидеть код.

Я работаю с текстом в мемо, который загруженный из файла, а после завершения работы все сохраняется в txt файл назад. Если сортировка будет менять местами строки - этого делать нельзя, положение строк важный елемент программы. Вот код который удаляет строки:

Код

     for numS := 0 to memo2.Lines.Count-1 do
        begin
            if numS < nstring1 then begin
               memo2.Lines.Delete(0); nstring2 := nstring2 - 1; end else
            if numS > nstring2 then
               memo2.Lines.Delete(nstring2);
            Gauge2.Progress := Round(100*numS/linecount);
        end;
        memo2.Lines.SaveToFile(IntToStr(numF) + '.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
Код

cat file | head -1700 | tail -450 > newfile && mv newfile file

как-то так, не?

Автор: northener 6.8.2011, 00:07
Цитата(Zorak @  5.8.2011,  18:58 Найти цитируемый пост)
З.Ы. Идти построчно и удалять memo1.Lines.Delete(index) происходит оооочень долго

А если Memo заменить на StringList?
Зачем вообще нужно использовать визуальный компонент TMemo, созданный для интерактивного общения с пользователем, если нет ни пользователя, ни общения?

Автор: Poseidon 6.8.2011, 12:32
Zorak, тебе надо открыть файл, прочитать его весь, найти нужный блок, удалить все кроме этого блока и сохранить все обратно? Сделай по другому. Открой файл, найди нужный блок и сохрани его. И используй TStringList.

Автор: Zorak 6.8.2011, 13:04
Цитата(northener @ 6.8.2011,  00:07)
А если Memo заменить на StringList?

Очень таки дельный совет. Спасибо большое. Помогло. Ускорилось во много раз... время сократилось с 57 минут до 20 секунд -=)))...
Единственное это нарушился правильный отсчет нужных мне строк (тоесть nstring1 ищет правильно, а вот с nstring2 произошел сбой), но я не думаю что это большая проблема.... и единственное что у фиг-знает-во-сколько-больше времени увеличилось - это метод Replace в регулярных выражениях... тоесть это:
Код

 str := TStringList.Create;
 r:=tRegExpr.Create;

              for k:=0 to memo2.Lines.Count-1 do
         begin
              r.Expression:=memo2.Lines.Strings[k];
              str.Text:=r.Replace(str.Text,'',true);
         end;
              r.Free;


Содержимое memo2.Lines:
Код

<head[^>]*>[^<]*<[/]head>
<script[^>]*>[^<]*<[/]script>
<!--(.*?)-->
<![^>]+>
<[^>]+>


С memo ето работало примерно 0,01 секунды, а с StringList 0.9 секунды...(... Не могу понять почему еще пока что. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)