Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.034 c
4-1092900410
Lizka
2004-08-19 11:26
2004.09.26
Как узнать версию офис из программы?


14-1094803291
Pat
2004-09-10 12:01
2004.09.26
Клиент для форумов, использующих phpBB


14-1094627041
Drakosha
2004-09-08 11:04
2004.09.26
Батька супер джинс - сроки действия больше не действуют :(


1-1094717613
Alek
2004-09-09 12:13
2004.09.26
Как правильно передать масив в функцию?


1-1094995519
Marina
2004-09-12 17:25
2004.09.26
наследование от стандартного класса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский