powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBQuery - Out of memory
13 сообщений из 13, страница 1 из 1
IBQuery - Out of memory
    #39453666
Fofanov_Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поддерживаю один проект до меня писанный...
Разрослись клиентские базы и посыпались жалобы, на подобную ошибку при загрузке всех клиентов.
Прога при это жрет как не в себя память ~1Гб, а потом вываливает ошибку "Out of memory".
Данные в cxGrid таблицу грузятся через следующий код:
Код: pascal
1.
2.
3.
4.
5.
6.
grdGrid.BeginUpdate();
try
  OpenDataSetAndLocateOldId(setGrid, GetSqlText, [], aLocateId);
finally
  grdGrid.EndUpdate();
end;



Ошибка вывалит OpenDataSetAndLocateOldId, на операторе aDataSet.Open();
Код: 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.
procedure OpenDataSetAndLocateOldId(aDataSet : TIBQuery;
                                    aSQLText : String;
                                    aParams : array of const;
                                    aLocateId : Integer = 0;
                                    aIdFieldName : String = 'Id';
                                    aSetCursor : Boolean = True);
var
  AfterScroll : TDataSetNotifyEvent;
  I : Integer;
  OldCur : TCursor;
  v : TParam;
begin
  try
    OldCur := Screen.Cursor;
    Screen.Cursor := crSQLWait;
    try
      if (aLocateId = 0)
        then if (aDataSet.Active)
          then aLocateId := aDataSet.FieldByName(aIdFieldName).AsInteger;

      AfterScroll := aDataSet.AfterScroll;
      aDataSet.AfterScroll := nil;
      try
        if aDataSet.Active
          then aDataSet.close;

        ibCommitTrans(aDataSet.Transaction);

        aDataSet.SQL.Text := aSQLText;
        for I := 0 to High(aParams) do
        begin
          v := aDataSet.Params[I];
          LoadParam(aParams[i], v);
        end;
        aDataSet.Open();
        if (aLocateId > 0)
          then aDataSet.Locate(aIdFieldName, aLocateId, []);

      finally
        try    // если связь разорвалась - то и фиг с ней!
          if Assigned(aDataSet.AfterScroll)
            then aDataSet.AfterScroll := AfterScroll;
          if (Assigned(AfterScroll))
            then AfterScroll(aDataSet);
        except
        end;
      end;

    finally
      Screen.Cursor := OldCur;
    end;
  except
    on E:exception do
    begin
      logstr(dmGlobal.GetResStr(['{8665E7FD-193E-40EB-BB49-F0B34FE33ABE}'], 'Ошибка обновления набора данных: ')+ e.message);
      raise exception.Create(dmGlobal.GetResStr(['{8665E7FD-193E-40EB-BB49-F0B34FE33ABE}'], 'Ошибка обновления набора данных: ')+ e.message);
    end;
  end;
end;


Я насколько понял засада кроется в TIBQuery, которая кеширует данные и сжирает всю память.
Может посоветуете, как менее затратно подтягивать данные из базы? Киньте ссылки на примеры?
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453671
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fofanov_Alexey
Код: pascal
1.
aDataSet.Open();


Сколько там строк?
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453672
Fofanov_Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,
79025
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453687
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Use "where" clause, Luke!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453819
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ну, 80 тыщ строк это не предел для IBQuery.
А какая ширина строки и один ли это датасет
(или хвостиками куча деталей тянется) ?
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453820
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер локальный или сетевой?
Версия IB/FB какая?
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453841
Fofanov_Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛюбезныйСервер локальный или сетевой?
Версия IB/FB какая?
Локальный. Версия 2.5.7
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453845
Fofanov_Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов РустамДа ну, 80 тыщ строк это не предел для IBQuery.
А какая ширина строки и один ли это датасет
(или хвостиками куча деталей тянется) ?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select C.ID, C.NAME, C.NAME1, C.NAME2, C.FULLNAME, INF.NAME as INFORMATIONSOURCE, C.ORDERQUANT, C.ISBLACKLIST,
       C.BLACKLISTINFO, C.BIRTHDATE, C.EMAIL, C.INFO, C.SMSOK, C.CARDNUMBER, DL.NAME as DISCOUNTNAME,
       coalesce(C.REGISTERONSITE, '0') as REGISTERONSITE, coalesce(C.HASORDERONSITE, 0) as HASORDERONSITE,
       CO.NAME as ORGANIZATION,
       (select first 1 CP.PHONE
        from CLIENT_PHONES CP
        where CP.ENABLED = 1 and CP.CLIENTID = C.ID) as PHONE,
       (select first 1 CA.FULLADDR
        from CLIENT_ADDRESS CA
        where CA.ENABLED = 1 and CA.CLIENTID = C.ID) as FULLADDR,
        cast(DATETODATESTR(C.LASTORDERDATE) as date) as LASTORDERDATE,
        0 as CACVALUE, 0 as CACVALUE_BONUS, null as DCSCARDNUMBER,
       (select sum(coalesce(OSUM.COSTALL, 0))
        from ORDERS OSUM
        where (OSUM.CLIENTID = C.ID) and (OSUM.ENABLED = 1)) as ORDERSSUMM
from CLIENTS C
left join INFORMATION_SOURCE INF on INF.ID = C.INFORMATIONSOURCE
left join DISCOUNT_LIST DL on DL.ID = C.DISCOUNTID
left join CLIENTS_ORGANIZATIONS CO on CO.ID = C.CLIENT_ORGANIZATION_ID
where C.ENABLED = 1   



Если результаты сохранить в текстовый файл, то займет порядка 13Мб
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453860
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fofanov_Alexey,

Блобы есть?
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453863
Fofanov_Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Fofanov_Alexey,

Блобы есть?
Нет
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453892
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамДа ну, 80 тыщ строк это не предел для IBQuery.

Во-первых, всё это ещё всасывается в сх, так что потребности в памяти можешь удвоить,
во-вторых, у IBE дурное кэширование, которое жрёт память на пустое место.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453940
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fofanov_AlexeyЕсли результаты сохранить в текстовый файл, то займет порядка 13МбКак же ты их сохраняешь, если Out of memory?

Уже спросили про размер строки, хотябы на пальцах сложи по длинам полей.

Вдрух строка мегабайт весит? Тут обсуждать нечего, уверен, проблема в этом. Тяжелые строки не надо тысячами в память фетчить.
...
Рейтинг: 0 / 0
IBQuery - Out of memory
    #39453960
Fofanov_Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockFofanov_AlexeyЕсли результаты сохранить в текстовый файл, то займет порядка 13МбКак же ты их сохраняешь, если Out of memory?

В IBExperte выполнил тот же запрос, и экспортировал в текстовый файл.

YuRockУже спросили про размер строки, хотябы на пальцах сложи по длинам полей.

Вдрух строка мегабайт весит? Тут обсуждать нечего, уверен, проблема в этом. Тяжелые строки не надо тысячами в память фетчить.

Локализовал немного проблему, вылетает в DevExpress (v.14.2.2) компоненте TcxCustomDataController.LoadStorage в функции LoadData, в цикле загрузки данных, где-то на 55 тыс. записи...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
AValueDefReader := GetValueDefReaderClass.Create;
try
  while not IsEOF do
  begin
    ARecordIndex := DataStorage.AppendRecord;
    DataStorage.ReadRecord(ARecordIndex, AValueDefReader);
    Self.DoReadRecord(ARecordIndex);
    Next;
  end;
finally
  AValueDefReader.Free;
end;



Сейчас посчитаю длину полей...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBQuery - Out of memory
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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