Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память / 18 сообщений из 18, страница 1 из 1
09.11.2017, 20:47:39
    #39550549
Kikoma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Всем привет.
Помогите решить проблему:

Читаю из текстового файла строку, разбираю на составляющие и делаю разные проверки. При этом выполняется от 4 до 6 простых запросов "SELECT" (максимум данные из двух таблиц).
После подготовленные данные вставляю в таблицу INSERT или UPDATE

Сама проблема заключается в том, что при чтении файла с 18500 строками, память приложения вырастает из 17 Мб до 1470 Мб.

Выяснил, что запрос insert или update не влияет на память (вынес этот запрос в конец процедуры, когда доходила до него очередь, память уже занимала 1,4 Гб)

При чем после закрытия приложения, память сначала уменьшается в течении секунд 20, и потом приложение закрывается.

Подскажите, куда посмотреть . Заранее спасибо.
...
Рейтинг: 0 / 0
09.11.2017, 20:54:26
    #39550552
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Free добавить надо
...
Рейтинг: 0 / 0
09.11.2017, 20:55:43
    #39550554
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Kikoma...Подскажите, куда посмотреть . Заранее спасибо.
В код.
Пожалусто.
...
Рейтинг: 0 / 0
09.11.2017, 20:59:10
    #39550556
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
KikomaВыяснил, что запрос insert или update не влияет на память (вынес этот запрос в конец процедуры, когда доходила до него очередь, память уже занимала 1,4 Гб)Ну дык локализуйте (или код показывайте).

Вероятно и "SQLite+FireDac" тоже не при чём, а дело в том, как
Вы файл читаете, строки храните, запросы формируете и т.д.
...
Рейтинг: 0 / 0
09.11.2017, 21:23:49
    #39550570
Kikoma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Код: pascal
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.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
procedure TfmImport1C.Button1Click(Sender: TObject);
var
  f: TStringList;
  s: string;
  i, pos1, pos2, len: integer;
  year, month: Word;
  LScode, LSname, FIO, city, street, house, flat, uslcode, uslname, rsocode,
    rsoINN, period, addr, SBCode: string;
  sum, sum_in, sum_nach, sum_pay, sum_out, tarif: real;
  usluga_id, id_rso: integer;

begin
  with DM.FDQuery4 do begin
    Close;
    SQL.Text := '';
  end;
  
  FormatSettings.DecimalSeparator := ',';
  if FileExists(Edit1.Text) then
  begin
    RE.Lines.Clear;
    RE.Lines.Add('Старт...');
  
    // ..... Убрал код всякие проверки и разборы строк... не важно...
  
    period := FormatDateTime('yyyy-mm-dd', EncodeDate(year, month, 1));
    
	RE.Lines.Add('Период: ' + period);

    //Читаем файл
	f := TStringList.Create;
    f.LoadFromFile(Edit1.Text);
    
	ProgressBar1.Max := f.Count;
    ProgressBar1.Position := 0;
    ProgressBar1.Enabled := True;
    RE.Lines.Add('Всего записей: ' + IntToStr(ProgressBar1.Max));
    // Очищаем Таблицу БД
    with DM.FDQuery1 do
    begin
      SQL.Text := 'DELETE FROM nach1C_temp';
      ExecSQL;
    end;
  end
  else
  begin
    RE.Lines.Add('File not found. Execution terminated!');
    exit;
  end;

  ProgressBar1.Visible := True;
  // Поехали читать строки
  for i := 0 to f.Count - 1 do
  begin
    s := f.Strings[i];

    ProgressBar1.Position := i;
    Application.ProcessMessages;
    
	if (s[1] <> '#') and (s[1] <> '=') then
    begin
      FormatSettings.DecimalSeparator := ',';
      pos2 := Pos(';', s);
      LScode := Copy(s, 1, pos2 - 1);
      Delete(s, 1, pos2);
      pos2 := Pos(';', s);
      LSname := Copy(s, 1, pos2 - 1);
      Delete(s, 1, pos2);
      pos2 := Pos(';', s);
      FIO := Copy(s, 1, pos2 - 1);
      Delete(s, 1, pos2);
      pos2 := Pos(';', s);
      city := Copy(s, 1, pos2 - 1);
      Delete(s, 1, pos2);
      pos2 := Pos(';', s);
      street := Copy(s, 1, pos2 - 1);
      Delete(s, 1, pos2);
      
	  // .... Код сократил.... Выковыриваем данные из строки
	 
      begin // Это услуга полная
        SBCode := fmSettings.GetOption('SBNumGA');
        
		// Начинаем запись в БД
        usluga_id := 0;
        // Проверяем есть ли такая услуга и сколько их записей
        if length(rsocode) = 0 then
        begin
          if sum_out <> 0 then
            RE.Lines.Add('ERROR: line[' + IntToStr(i) + ']. ЛС[' + LScode +
              '] Адр[' + street + ',' + house + ',' + flat + '] Услуга[' +
              uslname + '] Поставщик не заполнен! Пропущена');
          // Необходимо создавать историю дом+услуга и в ней искать РСО
          // и потом определять id услуги

        end
        else // if length(rsocode) = 0 then
        begin
          with DM.FDQuery1 do
          begin
            Close;
            s := 'SELECT * FROM uslugi WHERE ' + '(code_usl = ''' + uslcode +
              ''') AND ' + '(code_rso = ''' + rsocode + ''')';
            SQL.Text := s;
            Open;
          end;
          if DM.FDQuery1.RecordCount = 1 then
            usluga_id := DM.FDQuery1.FieldByName('id').AsInteger
          else if DM.FDQuery1.RecordCount > 1 then
          begin
            // Найдено больше одной услуги с таким кодом. Уточняем по рсо
            RE.Lines.Add('ERROR: line[' + IntToStr(i) +
              '] Найдено несколько услуг [codeusl=' + uslcode + ';rsocode=' +
              rsocode + '] ');
          end
          else
          begin
            // Не найдено такой услуги, надо заводить новую
            // ищем поставщика (РСО) если нету то заводим
            with DM.FDQuery1 do
            begin
              Close;
              s := 'SELECT * FROM rso WHERE code = ''' + rsocode + '''';
              SQL.Text := s;
              Open;
            end;
            if DM.FDQuery1.RecordCount = 1 then
              id_rso := DM.FDQuery1.FieldByName('id').AsInteger
            else
            begin
              // Ресурсника нет, заводим
              with DM.FDQuery1 do
              begin
                
				// ...... Данный запрос не срабатывает, т.к. уже все нужные данные в таблице есть
				
				Close;
                s := 'INSERT INTO rso (code, inn)' + ' VALUES (''' + rsocode +
                  ''',''' + rsoINN + ''')';
                SQL.Text := s;
                ExecSQL;
                s := 'SELECT * FROM rso WHERE inn = "' + rsoINN + '"';
                SQL.Text := s;
                Open;
                id_rso := FieldByName('id').value;
              end;
            end;
            // заводим услугу
            with DM.FDQuery1 do
            begin
              Close;
              
			  // ...... Данный запрос не срабатывает, т.к. уже все нужные данные в таблице есть
			  
			  s := 'INSERT INTO uslugi (code_usl, name_usl, code_rso, id_rso)' +
                ' VALUES (''' + uslcode + ''',''' + uslname + ''',''' + rsocode
                + ''',' + IntToStr(id_rso) + ')';
              SQL.Text := s;
              ExecSQL;
              s := 'SELECT * FROM uslugi WHERE ' + '(code_usl = ''' + uslcode +
                ''') AND ' + '(id_rso = ' + IntToStr(id_rso) + ')';
              SQL.Text := s;
              Open;
              usluga_id := FieldByName('id').value;
              RE.Lines.Add('Inf: Заведена услуга id=' + IntToStr(usluga_id) +
                ' name_usl=' + uslname + ' поставщик инн ' + rsoINN);
            end;

          end;
        end;
        if usluga_id = 0 then
        begin
          if sum_out <> 0 then
            RE.Lines.Add('ERROR: line[' + IntToStr(i) +
              '] Пропущена. Услуга не определена!');
        end
        else
        begin
          // Добавляем запись в БД
          // Ищем есть ли такая запись, то UPDATE иначе INSERT
          with DM.FDQuery2 do
          begin
            Close;
            SQL.Text := 'SELECT id FROM nach1C WHERE ' + 'lscode = ' + '''' +
              LScode + ''' AND ' + 'period =''' + period + ''' AND usluga_id = '
              + IntToStr(usluga_id);
            Open;
            if RecordCount > 0 then
              id_rso := FieldByName('id').value
            else
              id_rso := -1;
          end;
          if id_rso = -1 then
            with DM.FDQuery4 do // Добовляем новую запись
            begin
              //Close;
              if (length(FIO) = 0) or (FIO = '<>') then
                FIO := LSname;
              addr := city + ', ' + street + ', ' + house + ', ';

              addr := addr + flat;
              FormatSettings.DecimalSeparator := '.';
              s := 'INSERT INTO nach1C (lscode, FIO, addr, period, usluga_id,sum_in, '
                + 'sum_nach, sum_opl, sum_out, tarif, SBCode)' + ' VALUES (''' +
                LScode + ''',''' + FIO + ''',''' + addr + ''',''' + period +
                ''',' + IntToStr(usluga_id) + ',' + FloatToStr(sum_in) + ',' +
                FloatToStr(sum_nach) + ',' + FloatToStr(sum_pay) + ',' +
                FloatToStr(sum_out) + ',' + FloatToStr(tarif) + ',''' +
                SBCode + ''');';
              SQL.Add(s);
              //ExecSQL;
            end
          else
            with DM.FDQuery4 do // Обновляем существующую запись
            begin
              //Close;
              if (length(FIO) = 0) or (FIO = '<>') then
                FIO := LSname;
              addr := city + ', ' + street + ', ' + house + ', ';
              // if Pos('д.', house) = 0 then
              // addr := addr + 'д.';
              // addr := addr + house + ', ';
              // if Pos('кв.', flat) = 0 then
              // addr := addr + 'кв.';
              addr := addr + flat;
              FormatSettings.DecimalSeparator := '.';
              s := 'UPDATE nach1C SET ' + 'lscode = ''' + LScode + '''' +
                ', FIO = ''' + FIO + '''' + ', addr = ''' + addr + '''' +
                ', period = ''' + period + '''' + ', usluga_id = ' +
                IntToStr(usluga_id) + ', sum_in = ' + FloatToStr(sum_in) +
                ', sum_nach = ' + FloatToStr(sum_nach) + ', sum_opl = ' +
                FloatToStr(sum_pay) + ', sum_out = ' + FloatToStr(sum_out) +
                ', tarif = ' + FloatToStr(tarif)+';';
              SQL.Add(s);
              //SQL.Text := s;
              //ExecSQL;
            end;
        end;
      end;
    end; // if (s[1] <> '#') and (s[i] <> '=')

  end;
  ProgressBar1.Visible := False;

  RE.Lines.Add('Чтение файла завершено, Записываем в БД...');
  with DM do begin
    FDConnection1.StartTransaction;
    FDQuery4.ExecSQL;
    FDConnection1.Commit;
  end;
  RE.Lines.Add('Импорт файла завершен!');
  f.Free;
end;



Проверка данных, т.е. запросы к БД, проходит вся на двух FDQuery1 и FDQUery2
Запись происходит FDQuery4
...
Рейтинг: 0 / 0
09.11.2017, 21:32:40
    #39550576
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
GetOption -- можно вынести за пределы всего цикла. Если проблема с памятью решится -- значит см код внутри.

Так же некорректно сделано с query4 -- надо убрать в двух местах SQL.Add(s); и добавить туда присвоение через Text.

Вроде больше ничего подозрительного нет.
...
Рейтинг: 0 / 0
09.11.2017, 21:35:47
    #39550578
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Еще надо добавить ReportMemoryLeaksOnShutdown := True куда-нибудь при запуске приложения, чтобы в конце при завершении появился отчет об утечках памяти, если они были (те объекты, что надо освободить вручную в коде через free).
...
Рейтинг: 0 / 0
09.11.2017, 21:36:49
    #39550579
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
"Ихтиандр, сын мой, я тебе еды принес..." - (с).
...
Рейтинг: 0 / 0
09.11.2017, 21:38:56
    #39550580
Kikoma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Сильно можно и не разбираться в коде. основной алгоритм такой
Код: pascal
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.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
var
  f: TStringList;
  s: string;
begin
// читаем файл
    f := TStringList.Create;
    f.LoadFromFile(Edit1.Text);

//разбираем построчно
for i := 0 to f.Count - 1 do
  begin
    s := f.Strings[i];

    // Выковыриваем данные из строки s
    pos2 := Pos(';', s);
    Данные1 := Copy(s, 1, pos2 - 1);
    Delete(s, 1, pos2);

    Данные2 := Pos(';', s);
    LSname := Copy(s, 1, pos2 - 1);
    Delete(s, 1, pos2);

    //Делаем несколько запросов, чтобы данные проверить/дополнить
    with DM.FDQuery1 do
       begin
            Close;
            s := 'SELECT * FROM uslugi WHERE ' + '(code_usl = ''' + uslcode +
              ''') AND ' + '(code_rso = ''' + rsocode + ''')';
            SQL.Text := s;
            Open;
       end;
     if DM.FDQuery1.RecordCount = 1 then
            usluga_id := DM.FDQuery1.FieldByName('id').AsInteger
    else if DM.FDQuery1.RecordCount > 1 then
          begin
            // Найдено больше одной услуги с таким кодом. Уточняем по рсо
            RE.Lines.Add('ERROR: line[' + IntToStr(i) +
              '] Найдено несколько услуг [codeusl=' + uslcode + ';rsocode=' +
              rsocode + '] ');
          end;

   //Таких запросов штук 5;

//В итоге подготавливаем запрос для добавления данных в таблицу
// Добавляем запись в БД
          // Ищем есть ли такая запись, то UPDATE иначе INSERT
          with DM.FDQuery2 do
          begin
            Close;
            SQL.Text := 'SELECT id FROM nach1C WHERE ' + 'lscode = ' + '''' +
              LScode + ''' AND ' + 'period =''' + period + ''' AND usluga_id = '
              + IntToStr(usluga_id);
            Open;
            if RecordCount > 0 then
              id_rso := FieldByName('id').value
            else
              id_rso := -1;
          end;
          if id_rso = -1 then
            with DM.FDQuery4 do // Добовляем новую запись
            begin
              //Close;
              if (length(FIO) = 0) or (FIO = '<>') then
                FIO := LSname;
              addr := city + ', ' + street + ', ' + house + ', ';

              addr := addr + flat;
              FormatSettings.DecimalSeparator := '.';
              s := 'INSERT INTO nach1C (lscode, FIO, addr, period, usluga_id,sum_in, '
                + 'sum_nach, sum_opl, sum_out, tarif, SBCode)' + ' VALUES (''' +
                LScode + ''',''' + FIO + ''',''' + addr + ''',''' + period +
                ''',' + IntToStr(usluga_id) + ',' + FloatToStr(sum_in) + ',' +
                FloatToStr(sum_nach) + ',' + FloatToStr(sum_pay) + ',' +
                FloatToStr(sum_out) + ',' + FloatToStr(tarif) + ',''' +
                SBCode + ''');';
              SQL.Add(s);
              //ExecSQL;
            end
          else
            with DM.FDQuery4 do // Обновляем существующую запись
            begin
              //Close;
              if (length(FIO) = 0) or (FIO = '<>') then
                FIO := LSname;
              addr := city + ', ' + street + ', ' + house + ', ';
              // if Pos('д.', house) = 0 then
              // addr := addr + 'д.';
              // addr := addr + house + ', ';
              // if Pos('кв.', flat) = 0 then
              // addr := addr + 'кв.';
              addr := addr + flat;
              FormatSettings.DecimalSeparator := '.';
              s := 'UPDATE nach1C SET ' + 'lscode = ''' + LScode + '''' +
                ', FIO = ''' + FIO + '''' + ', addr = ''' + addr + '''' +
                ', period = ''' + period + '''' + ', usluga_id = ' +
                IntToStr(usluga_id) + ', sum_in = ' + FloatToStr(sum_in) +
                ', sum_nach = ' + FloatToStr(sum_nach) + ', sum_opl = ' +
                FloatToStr(sum_pay) + ', sum_out = ' + FloatToStr(sum_out) +
                ', tarif = ' + FloatToStr(tarif)+';';
              SQL.Add(s);
              //SQL.Text := s;
              //ExecSQL;
            end;
        end;

//Ну и напоследок добавляем, выполняем запрос
RE.Lines.Add('Чтение файла завершено, Записываем в БД...');
  
with DM do begin
    FDConnection1.StartTransaction;
    FDQuery4.ExecSQL;
    FDConnection1.Commit;
  end;
  RE.Lines.Add('Импорт файла завершен!');


  f.Free;


end;
...
Рейтинг: 0 / 0
09.11.2017, 21:51:50
    #39550582
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Если нет утечек, то проблема может быть в том, что у тебя вычитана куча данных из базы в какой-то из наборов.
...
Рейтинг: 0 / 0
09.11.2017, 21:55:30
    #39550583
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Еще может быть включена ЭврикаЛог с поиском утечек или другой аналогичный сервис (но когда он есть, то помощь форума уже не нужна).
...
Рейтинг: 0 / 0
09.11.2017, 21:57:19
    #39550586
Kikoma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
JaDiGetOption -- можно вынести за пределы всего цикла. Если проблема с памятью решится -- значит см код внутри.

Так же некорректно сделано с query4 -- надо убрать в двух местах SQL.Add(s); и добавить туда присвоение через Text.

Вроде больше ничего подозрительного нет.

Проблема была с GetOption. Задал явно и все встало нормально.

А внутри процедуры динамически создавал TFDQuery, а Free не делал.

Спасибо большое JaDi!


Кстати,
JaDiТак же некорректно сделано с query4 -- надо убрать в двух местах SQL.Add(s); и добавить туда присвоение через Text.
Это как? можно подробнее... с Text не работал
...
Рейтинг: 0 / 0
09.11.2017, 22:01:07
    #39550589
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
makhaonЕсли нет утечек, то проблема может быть в том, что у тебя вычитана куча данных из базы в какой-то из наборов.
Какие блобы.

Человек целиком считывает текстовый файл, формирует из строчек запросы либо insert, либо update, ВСЁ СРАЗУ запихивает в FDQuery4.SQL, и, если FDQuery4.SQL не взорвался от количества, просит сервер исполнить весь пакет говна:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// начало цикла
            with DM.FDQuery4 do // Добовляем новую запись
            begin
            if ... then  begin
...
              s := 'INSERT INTO nach1C (lscode, FIO, addr, period, usluga_id,sum_in, '
...
              SQL.Add(s);
            end else begin
...
              s := 'UPDATE nach1C SET ' + 'lscode = ''' + LScode + '''' +
...
              SQL.Add(s);
            end 
// конец цикла
...
  with DM do begin
...
    FDQuery4.ExecSQL;
...


20941493
...
Рейтинг: 0 / 0
09.11.2017, 22:07:56
    #39550593
Kikoma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
чччД и, если FDQuery4.SQL не взорвался от количества
20941493
)) Точно подмечено ))))))

Вообще запись сразу делалась, это я его отдельно вынес, дабы вычислить от чего память растет, от чтения или записи.

Оказалось, от кривых ручек ))))))
...
Рейтинг: 0 / 0
09.11.2017, 23:08:57
    #39550600
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
KikomaЭто как? можно подробнее... с Text не работал
Я к тому, что там формируется огромнейший список запросов, который потом отправляется на сервер. Видимо, у фаердак слишком умный парсер, который этот запрос разбирает на отдельные части и отсылает их поочередно. Это неправильно. Нужен один запрос? Можно тогда уж делать через конструкцию вида SELECT INTO table(x,y) SELECT x,y... Но вообще, я бы отправлял их по отдельности (один запрос, один вызов) с информированием о прогрессе. И только потом уже, когда будет затык именно в этом месте -- решать вопрос, каким именно образом формировать пачки и отправлять на сервер, чтобы все быстрее было.
...
Рейтинг: 0 / 0
10.11.2017, 01:17:22
    #39550630
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
JaDiЯ к тому, что там формируется огромнейший список запросов, который потом отправляется на сервер.
Давно у SQLite отрос сервер?..
Но за код, где запросы закрываются перед использованием, надо отрывать руки, конечно.
...
Рейтинг: 0 / 0
10.11.2017, 07:08:49
    #39550647
Kikoma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
Dimitry SibiryakovНо за код, где запросы закрываются перед использованием, надо отрывать руки, конечно.

Что не так то? Научи уму разуму, всегда готов выслушать дельный совет


А то что огромный запрос формируется, то это было сделано для выявления проблемы, сейчас все вернулось назад. Хотя с другой стороны, я в этом запросе большом не вижу проблем. Получился большой SQL script который успешно выполняется. Единственный минус: прогресс не виден. В остальном проблем не вижу. Ну и в любом случае, повторюсь, уже не актуально, т.к. вернулся на одна строка - один запрос.
...
Рейтинг: 0 / 0
10.11.2017, 13:32:51
    #39550946
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
KikomaЧто не так то?

Время существования ресурса не контролируется. Поэтому у тебя и сюрпризы в виде неизвестно
куда израсходованной памяти. Правильный паттерн выглядит так: выделил ресурс - использовал
- освободил сразу как только тот стал не нужен. У тебя же наоборот: выделил ресурс -
использовал - забыл про него до следующего раза.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]