unidirectional=true
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
unidirectional=true
Подскажите, можно ли как-то включить Unidirectional в IBQuery, чтоб потом в DBGrid нормально все отображалось. У меня при открытии таблицы с установленным параметром и после прокрутки грида вниз, а потом вверх отображается полная ахинея.
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
вот эмуляция проблемы, код и база. архив небольшой 400kB, посмотрите.
ftp://1:1@213.186.210.150/test.rar
ftp://1:1@213.186.210.150/test.rar
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
выборки минимальны от 5 до 10, просто за сутки их очень много и приходит финиш по какой-то причине(out of memory у клиента хотя свободной памяти просто завались) вся причина в tibquery то ли он не видит что оперативки просто завались то ли черт его знает что за бага в нем, в инете масса топиков на эту тему. и решение всегда предлагается либо unifirectional=true либо вообще уйти с этого компонента например на tibsql на котором как народ проверил эта проблема сразу исчезает. но уйти нет возможности прога нереально большая, переписать год уйдет. вот и ищу решение, вразумительного ответа нет нигде к сожалению.
Я бы советовал таки меньше слушать разный трёп по инету, а больше думать головом. TIBQuery кеширует всё, что начитал, именно для того, чтобы позволить обратный скроллинг. До момента Close, когда всё и освобождает. А UniDirectional как раз и значит - ОдноНаправленный. Режим используется главным образом в скрытых от ползателя циклах типа "пробежаться по выборке от начала до конца и всё проапдейтить по хитрым условиям или залить в другую таблицу, типа датапампа" или когда TIBQuery используется в качестве источника данных для другого кеширующего компонента, например TClientDataSet - механизмы MIDAS устроены так, что при открытии сами открывают источник, вытягивают всё в ClientDataSet и источник закрывают, то есть при UniDirectional False в момент закачки получится никому не нужный двойной расход памяти. Если же у тебя курсоры короткие, и не открываются сотнями тыщ без закрытия, то ты не там ищешь. У тебя утечка памяти, в твоём собственном коде, а не перерасход. И out of memory у клиента быть не может, если у него этой мемори завались.
добавлю к словам Merlin-а, что неплохо-бы взять новое приложение, влепить туда "проблемный ibquery с гридом", и пооткрывать-закрывать это в автоматическом режиме примерно миллион раз. И посмотреть, сколько такое приложение сожрет. И сравнить с частотой вызовов в реальной работе. И т.п. А не слушать, какой народ и чего там проверял. Сам же видишь - "вразумительного" ответа нигде нет.на котором как народ проверил эта проблема сразу исчезает.
Чудится мне, что проблема не в ibquery, о которой бы тут все только и говорили, а в мощных утечках памяти в коде приложения.
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
я так понимаю что если есть утечки памяти в коде в компоненте и так далее неважно где, мы приходим к тому что память сьедаеться и получаем out of memory. но ЕСТЬ свободная память ЕСТЬ ну как же еще это написать, ну простым диспетчером задач смотрю и вижу 1.5Gb свободной. или я как-то в проге должен указать что вот бери память сколько те надо не стесняйся. я лично подозреваю что дело даже не в количестве выбранных записей 100 или 100000, а в том что кеш не очищается в принципе, и как бы я не пытался минимизировать выборку в течении какого-то времени опять будет out of memory.
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Есть память физическая, а есть виртуальная. Нехватает второй.victor3000 писал(а):я так понимаю что если есть утечки памяти в коде в компоненте и так далее неважно где, мы приходим к тому что память сьедаеться и получаем out of memory. но ЕСТЬ свободная память ЕСТЬ ну как же еще это написать, ну простым диспетчером задач смотрю и вижу 1.5Gb свободной. или я как-то в проге должен указать что вот бери память сколько те надо не стесняйся. я лично подозреваю что дело даже не в количестве выбранных записей 100 или 100000, а в том что кеш не очищается в принципе, и как бы я не пытался минимизировать выборку в течении какого-то времени опять будет out of memory.
Кто-то не умеет пользоваться VirtualAlloc \ VirtualFree
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32
ок. я запутался совсем. есть какая-то память кроме физической она заканчивается. чесно говоря для меня это новость. я не умею пользоваться какими-то алоками и фри чего-то там(чесно говоря не понимаю зачем это нужно). ладно признаю я полный идиот так будьте же так любезны не говорить загадками а скажите конкретно что нужно сделать. а то фигня получается память физическая есть, а файрберд работает с какой-то другой памятью, не понятно лично для меня причине.
я абсолютно не против пускай он использует физическую и не пишет мне
out of memory при 1,5gb свободного ОЗУ, ах да еще 2Gb файл подкачки существует тоже кстати пустует.
я абсолютно не против пускай он использует физическую и не пишет мне
out of memory при 1,5gb свободного ОЗУ, ах да еще 2Gb файл подкачки существует тоже кстати пустует.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
-
- Сообщения: 98
- Зарегистрирован: 27 апр 2006, 09:32