Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.05.2016
Сообщений: 13
1

Ускорение процесса Tstringlist

09.06.2017, 17:20. Показов 3352. Ответов 46
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. С ув обращаюсь с просьбой помочь разобраться, как ускорить процесс при чтении нескольких файлов.
Так чтобы кратко, то существует файл temps.txt который я предварительно разбиваю на 12 частей.
Файл весит около 50 мб из которого c помощью RegExpr я делаю сортировку.
Если использовать файл целиком, то по мере выполнения процесса, чем ближе к концу выполнения операции, тем медленнее.
Поэтому подумал о том, что не плохо будет, если необходимый файл предварительно разбить на части и работать уже с мелким размером, что должно ускорить процесс.
Написал небольшую процедуру, все требуемые операции выполняются как надо, за исключением скорости, с которой проблема так и не решилась.
Прилагаю код с просьбой подсказать может что не так или-же всё задуманное можно осуществить каким-то более простым решением, слышал кое что о массивах в стринглисте, может копать в эту сторону, но с подобным не сталкивался.
Для информации, разбиваемый файл содержит в себе более 100к строк, а время на выполнение учитывая железо составляет около 8 секунд.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.Button5Click(Sender: TObject);
var
R : TRegExpr;
TStL : TStringList;
s,code : string;
index,b,i : Integer;
 
    begin
    index:=12;
      for b:=1 to index do begin
       TStL := TStringList.Create;
        TStL.LoadFromFile('temps'+inttostr(b)+ '.txt');
         R := TRegExpr.Create;
          gauge1.MaxValue:=index;
           log('Начинаю выполнять задачу номер'+inttostr(b));
 
         for i:=0 to TStL.Count -1 do  
      begin
       gauge1.Progress:=b;
       R.InputString := TStL.Strings[i];
       R.Expression := ':';
 
       if r.Exec then
      REPEAT s:=r.Match[0];
       code:=code+s+#13#10;
       Application.ProcessMessages;
      UNTIL not r.ExecNext;
      end;
 
  r.Free;
  TStL.free;
  Log('Команда '+temps +inttostr(b)+' выполнена');
  end;
 end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2017, 17:20
Ответы с готовыми решениями:

Зашифровать TStringList, сохранить, прочитать, получить исходный TStringList
Здравствуйте. Требуется решение следующей задачи: Зашифровать TStringList (количество строк...

Неясности с TStringList. Как найти наибольший элемент в TStringList?
Добрый день. Проблема следующая: мне надо в TStringList найти самую длинную строчку. Пытаюсь...

TStringList
Всем привет, ребят расскажите что не так? var Form1: TForm1; listU, listN: TStringList; ...

TStringList
есть переменные mem,send,mema:TStringList; дает ошибку на строке 1 mema:=mem+send;...

46
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,130
Записей в блоге: 3
15.06.2017, 16:27 41
Author24 — интернет-сервис помощи студентам
s9va79, файл можете дать?
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,377
15.06.2017, 18:03 42
Вот интересно вы рассуждаете. На форум вы выкладываете совершенно левый файл данных, который к исходной задаче не имеет отношения, а от нас ожидаете правильного решения. Вот я писал чуть ранее и пока не получил ответа.
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
15.06.2017, 18:25 43
Цитата Сообщение от s9va79 Посмотреть сообщение
осваиваю потоки более детально, потому как до этого не приходилось заниматься столь плотно такими не столь простыми задачами, во всяком случае по мне, потому как просто созданием потока, как я привел пример тут не отмажешься...
Еще раз спасибо всем тем, кто старается ответить по делу, продолжаю далее..
Я уже излагал идею разделения индексов строк между потоками, в этом случае не нужно делить сам файла на мелкие файлы

Добавлено через 11 минут
Имеем гигантских размеров файл.
Загружаем файл в TStringList;

Создаем в отдельном модуле поток.
В нем описываем все алгоритмы обработки строк

далее из главного модуля
делаем так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var
 buff    : string;
 listFile : TStringList;
 HPing  : TMyHread;
 i         : integer;
counter: integer;
begin
 ...
 counter := 0;
 for i := 0 to listFile.Count -1 do
 begin
   Buffer := Buffer+listFile.strings[i]+#10#13; 
   if (counter = 1000) or (i = listFile.Count -1) then
   begin
     HPing := THreadPing.Create(true);
     HPing.Host   := IpListingForm.IpListMemo.Lines.Strings[i];
     HPing.Buffer := Buffer;
     HPing.FreeOnTerminate := true;
     HPing.Resume;
     counter := 0;
   end;
   counter := counter + 1;
 end;
end;
Примерно так можно разделить данные между потоками
HPing не обращайте внимание на имя переменной, выдрал из своего проекта, Пингую сервера в потоках...

Добавлено через 6 минут
То есть мы создаем порции содержащие строки и кормим наши потоки...

Добавлено через 1 минуту
и на HPing.Host := IpListingForm.IpListMemo.Lines.Strings[i]; это тоже не смотрите...
1
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,377
15.06.2017, 19:33 44
Имеем гигантских размеров файл.
Загружаем файл в TStringList;
Вот это очень непродуктивное решение, т.к. TStringList имеет обыкновение читать весь файл в память и как следствие будет пауза, пока он его прочитает. А зачем нам этого ждать? Намного эффективнее использовать для больших файлов AssignFile.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
unit Unit21;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, StrUtils;
 
type
  TTextMachine = class(TThread)
   Text: TStringList;
   constructor Create;
   procedure Execute; override;
   procedure Run(S: String);
  end;
 
  TForm21 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
 
  public
    { Public declarations }
  end;
 
var
  Form21: TForm21;
 
implementation
 
{$R *.dfm}
 
procedure TForm21.Button1Click(Sender: TObject);
var
  Txt: TextFile;
  S: String;
  Rows: Integer;
  TextMachine: TTextMachine;
begin
 OpenDialog1.FileName := 'H:\Old\Documents\Downloads\Kamsha_Ratkevich_Vremja_zolota_vremja_serebra.txt';
// if not OpenDialog1.Execute then Exit;
 AssignFile(Txt, OpenDialog1.FileName);
 Reset(Txt);
 Rows := 0;
 while not Eof(Txt)
 do begin
    if Rows mod 1000 = 0
    then begin
         if Assigned(TextMachine) then TextMachine.Start;
         TextMachine := TTextMachine.Create;
         end;
    ReadLn(Txt, S);
    Inc(Rows);
    TextMachine.Text.Add(S);
    end;
 if Rows mod 1000 <> 0 then TextMachine.Start;
 CloseFile(Txt);
end;
 
{ TTextMachine }
constructor TTextMachine.Create;
begin
 inherited Create(True);
 FreeOnTerminate := True;
 Text := TStringList.Create;
end;
 
procedure TTextMachine.Execute;
var i: Integer;
begin
 inherited;
 Synchronize(procedure begin Form21.Memo1.Lines.Add(Format('Start thread %d', [ThreadID])) end);
 for i := 0 to Text.Count - 1
 do begin
    Run(Text.Strings[i]);
    end;
 Synchronize(procedure begin Form21.Memo1.Lines.Add(Format('Finish thread %d Rows=%d', [ThreadID, Text.Count])) end);
end;
 
procedure TTextMachine.Run(S: String);
begin
 S := ReverseString(S);
end;
 
end.
2
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
15.06.2017, 19:42 45
Цитата Сообщение от Пытливый Посмотреть сообщение
Вот это очень непродуктивное решение, т.к. TStringList имеет обыкновение читать весь файл в память и как следствие будет пауза, пока он его прочитает. А зачем нам этого ждать? Намного эффективнее использовать для больших файлов AssignFile.
Согласен, но концепция я думаю имеет место быть.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
15.06.2017, 19:44 46
есть эффективный TStreamReader
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,377
15.06.2017, 19:49 47
Интересный класс, как-то не сталкивался ранее. Но на первый взгляд существенно сложнее в работе чем AssignFile. Надо будет попробовать.
0
15.06.2017, 19:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2017, 19:49
Помогаю со студенческими работами здесь

Tstringlist
l : integer l , k : integer ; s

TStringList
sl := TStringList.Create; sl.Delimiter := ' '; sl.QuoteChar := '|'; sl.DelimitedText...

TStringList
Есть текстовый файл, в котором записаны слова по одному слову в строке. Могут встречаться пустые...

TStringList
Столкнулся с проблемой Суть: Имеется список TStringList в который записано допустим 40 строк...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru