Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: TADQuery.Last + EOutOfMemory
TADQuery.Last + EOutOfMemory
Posted: 2007/06/13 14:00
 
В MySQL таблице порядка 1 миллиона записей, если просто в цикле перебирать записи TADTable.Next, то стабильно примерно на 600000-ой записи вылетает исключение EOutOfMemory в коде
function TADMemPool.Alloc: Pointer;
begin
GetMem(Result, FItemSize);
end;
Аналогичная проблема и с TADQuery или если сделать TADQuery.Last
Re:TADQuery.Last + EOutOfMemory
Posted: 2007/06/13 16:10
 
Нормально. По умолчанию все записи запоминаются на случай просмотра уже "пройденных" - и на достаточно большой выборке память непременно закончится.
Если есть какая-то нездоровая потребность в обработке такого количества записей на клиенте, следует использовать однонаправленный запрос. А про TADTable надо забыть.
Re:TADQuery.Last + EOutOfMemory
Posted: 2007/06/16 03:40
 
Однонаправленный запрос это так?:

ADQuery1.Unidirectional := true;
ADQuery1.SQL.Add('SELECT * FROM rawlog');
ADQuery1.Active := true;

ADQuery1.Last;

Не работает: out of memory.
Re:TADQuery.Last + EOutOfMemory
Posted: 2007/06/16 10:18
 
Да, автору не хватило фантазии проверить абсурдное сочетание Unidirectional = True с Last или FetchOptions.Mode = fmAll. Вандалоустойчивости AnyDAC'у явно не хватает.
При нормальном переборе в цикле память расти не будет.
Re:TADQuery.Last + EOutOfMemory
Posted: 2007/06/21 09:40
 
Привет

Спасибо, принято и исправлено.

Удачи,
Дмитрий