Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Query сжирает всю память   Найти похожие ветки 

 
Desperado ©   (2004-08-29 11:14) [0]

есть IBQuery с запросом select * from table;
table состоит из ID integer          
                NAME1 varchar(4096)
                NAME2 varchar(2048)
в ней 10 записей.
После открытия Query Диспетчер задачь регистрирует выделение общей памяти объемом 6 метров. После закрытия Query - эти 6 метров освобождаются. В "процессах" процесс с Query сжирает всего несколько килобайт. Может ли Query сжирать столько памяти, и как этого избежать? В программе используется с десяток таких запросов, поэтому каждому п 6 метров- просто неприемлимо.
Конфигурация:
Delphi 5, SP1, SP2, IBX5.04
TIBQuery


 
DiamondShark ©   (2004-08-29 11:27) [1]

Открыть десять квери и посмотреть результат.
Казалось бы, что может быть проще?


 
Desperado ©   (2004-08-29 11:37) [2]

>Открыть десять квери и посмотреть результат.
>Казалось бы, что может быть проще?

Если бы все было так просто, я бы не спрашивал.
Как думаешь? как я заметил ошибку? Когда открыл десяток этих квери,да еще несколько раз в разных потоках, вот у меня и вылезло
Out of memory.

Вопрос был в том, нормально ли то, что квери жрет так много и как можно этого избежать.


 
Desdechado ©   (2004-08-30 14:09) [3]

квери при открытии вычитывает данные, информацию о транзакции, создает буфер регистрации изменении в данных
это может много места требовать, но не в 100 раз больше простых (4кб+2кб)*10записей
ищи, что еще делаешь


 
Rule ©   (2004-08-30 14:31) [4]

Не может он стого жрать это точно, смотри что там у тебя ещё


 
s999   (2004-08-30 14:56) [5]


> Вопрос был в том, нормально ли то, что квери жрет так много
> и как можно этого избежать


А чего гадать то? Алгоритм выделения памяти в IBX вполне прозрачен:

DataSet при открытии рапределяет RecordSize*BufferChunks байт

Далее, допустим BufferChunks = 100. C сервера фетчится 101-я запись. Датасет распределяет (RecordSize*BufferChunks)*2 байт  Делает он это через Realloc, поэтому, фактически, получается новое выделение с копированием предыдущего.

И так далее, то есть *3, *4, *5 ...

Засада еще здесь в том, что IBX-у нужна непрерывная память, поэтому "Out of memory" может случится раньше, чем реально память закончится.

Общепризнано, что используемая модель работы с памятью в IBX неудачна. В FibPlus вроде это уже переработано, да и Джеф (один из авторов IBX) неоднократно говорил, что собирается это сделать.    

Но твоя проблема, скорее всего, из-за того, что сильно "запузырил" BufferChunks. Вот и получается, что записей всего 10, а памяти распределяется под 100000(или что там у тебя).



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
14-1094435375
Думкин
2004-09-06 05:49
2004.09.26
С днем рождения! 6 сентября


1-1095074515
FileManager
2004-09-13 15:21
2004.09.26
Атрибуты файлов


3-1093948257
SiJack
2004-08-31 14:30
2004.09.26
Возможно ли в Access физическое удаление записей?


3-1093420001
Алексей
2004-08-25 11:46
2004.09.26
Альтернатива BDE и ADO для FOX и dBASE


14-1094361325
Думкин
2004-09-05 09:15
2004.09.26
С днем рождения! 5 сентября