Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBQuery - Out of memory / 13 сообщений из 13, страница 1 из 1
16.05.2017, 11:40:23
    #39453666
Fofanov_Alexey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
Поддерживаю один проект до меня писанный...
Разрослись клиентские базы и посыпались жалобы, на подобную ошибку при загрузке всех клиентов.
Прога при это жрет как не в себя память ~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
16.05.2017, 11:42:30
    #39453671
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
Fofanov_Alexey
Код: pascal
1.
aDataSet.Open();


Сколько там строк?
...
Рейтинг: 0 / 0
16.05.2017, 11:43:59
    #39453672
Fofanov_Alexey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
wadman,
79025
...
Рейтинг: 0 / 0
16.05.2017, 12:05:26
    #39453687
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
Use "where" clause, Luke!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.05.2017, 14:16:38
    #39453819
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
Да ну, 80 тыщ строк это не предел для IBQuery.
А какая ширина строки и один ли это датасет
(или хвостиками куча деталей тянется) ?
...
Рейтинг: 0 / 0
16.05.2017, 14:18:43
    #39453820
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
Сервер локальный или сетевой?
Версия IB/FB какая?
...
Рейтинг: 0 / 0
16.05.2017, 14:31:33
    #39453841
Fofanov_Alexey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
ЛюбезныйСервер локальный или сетевой?
Версия IB/FB какая?
Локальный. Версия 2.5.7
...
Рейтинг: 0 / 0
16.05.2017, 14:33:15
    #39453845
Fofanov_Alexey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
Гаджимурадов РустамДа ну, 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
16.05.2017, 14:46:44
    #39453860
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
Fofanov_Alexey,

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

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

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

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

Вдрух строка мегабайт весит? Тут обсуждать нечего, уверен, проблема в этом. Тяжелые строки не надо тысячами в память фетчить.
...
Рейтинг: 0 / 0
16.05.2017, 16:25:00
    #39453960
Fofanov_Alexey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBQuery - Out of memory
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBQuery - Out of memory / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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