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

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

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

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

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

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

Вероятно и "SQLite+FireDac" тоже не при чём, а дело в том, как
Вы файл читаете, строки храните, запросы формируете и т.д.
...
Рейтинг: 0 / 0
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550570
Kikoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550576
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetOption -- можно вынести за пределы всего цикла. Если проблема с памятью решится -- значит см код внутри.

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

Вроде больше ничего подозрительного нет.
...
Рейтинг: 0 / 0
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550578
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще надо добавить ReportMemoryLeaksOnShutdown := True куда-нибудь при запуске приложения, чтобы в конце при завершении появился отчет об утечках памяти, если они были (те объекты, что надо освободить вручную в коде через free).
...
Рейтинг: 0 / 0
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550579
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Ихтиандр, сын мой, я тебе еды принес..." - (с).
...
Рейтинг: 0 / 0
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550580
Kikoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сильно можно и не разбираться в коде. основной алгоритм такой
Код: 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
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550582
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нет утечек, то проблема может быть в том, что у тебя вычитана куча данных из базы в какой-то из наборов.
...
Рейтинг: 0 / 0
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550583
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще может быть включена ЭврикаЛог с поиском утечек или другой аналогичный сервис (но когда он есть, то помощь форума уже не нужна).
...
Рейтинг: 0 / 0
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550586
Kikoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDiGetOption -- можно вынести за пределы всего цикла. Если проблема с памятью решится -- значит см код внутри.

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

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

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

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

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


Кстати,
JaDiТак же некорректно сделано с query4 -- надо убрать в двух местах SQL.Add(s); и добавить туда присвоение через Text.
Это как? можно подробнее... с Text не работал
...
Рейтинг: 0 / 0
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550589
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
    #39550593
Kikoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД и, если FDQuery4.SQL не взорвался от количества
20941493
)) Точно подмечено ))))))

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

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

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


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

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


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