Сколько памяти берёт TIBQuery

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
KKomov
Сообщения: 14
Зарегистрирован: 20 дек 2007, 17:30

Сколько памяти берёт TIBQuery

Сообщение KKomov » 15 май 2008, 13:20

Есть база под сервером Firebird. На клиенте используются стандартные компоненты из Borland C++ Builder 6.

Одна таблица насчитывает 30.000 записей. При полной закачке её на клиента программа по таск менеджеру забирает ~300 мегабайт памяти. Меняем столбец сортировки и снова закачиваем все записи. Размер занятой памяти временно поднимается до 600 мегабайт, потом снова прежние 300. При этом вся база весит 30 мегабайт без индексов, 45 с индексами.

Это нормально? Нельзя ли как-то уменьшить аппетит по памяти?

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 15 май 2008, 14:14

Можно - не качай всю таблицу на клиента. :-)

KKomov
Сообщения: 14
Зарегистрирован: 20 дек 2007, 17:30

Сообщение KKomov » 06 июн 2008, 22:55

Tonal писал(а):Можно - не качай всю таблицу на клиента. :-)
Так не я ж качаю. А другие варианты? Что-то уж очень намного объём занятой памяти больше размера данных на диске. Нельзя ли закатать IBX-ам губу?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 07 июн 2008, 00:10

KKomov писал(а):
Tonal писал(а):Можно - не качай всю таблицу на клиента. :-)
Так не я ж качаю.
А хто? :shock:
KKomov писал(а): А другие варианты?
Чего варианты?
KKomov писал(а): Что-то уж очень намного объём занятой памяти больше размера данных на диске. Нельзя ли закатать IBX-ам губу?
Слово "компрессия" слышал? В смысле данных. В смысле на диске. В смысле сервером. Которые на клиенте распакованы. Малость подзакатать IBX-ам губу можно. Например, пересмотреть модель управления памятью. Но проще таки тянуть на клиента только то, что нужно, а не всё подряд, всё равно рано или поздно треснет любая память. Или, если таки нужно прокачать через клиента одноразово всё, делать это однонаправленно, без возможности скроллирвания взад, чтоб он отпускал уже просмотренное. Проперть UniDirectional.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 09 июн 2008, 08:32

KKomov писал(а):
Tonal писал(а):Можно - не качай всю таблицу на клиента. :-)
Так не я ж качаю. А другие варианты? Что-то уж очень намного объём занятой памяти больше размера данных на диске. Нельзя ли закатать IBX-ам губу?
Тебе действительно все 30000 записей нужно на клиенте одновременно?
Что ты с ними делаешь-то?
Вот умеришь ты аппетиты IBX к памяти, пусть даже она станит раза в 2 меньше чем на диске (компрессия в памяти), а количество данных вырастит на 2-3 порядка, и что будешь делать?

Читай однако про SQL, select и where. :-)

KKomov
Сообщения: 14
Зарегистрирован: 20 дек 2007, 17:30

Сообщение KKomov » 07 июл 2008, 16:17

Таблицу в 30000 записей выкачивает на клиента оператор, привычный работать с DBF. К сожалению, это пока единственная большая таблица в базе, к тому же рид-онли и часто используемая, поэтому для заказчика как бельмо на глазу. Мне интересно нащупать способ сделать работу с ней полегче. Данные в ней - текст, и размер их на диске не настолько велик. Отчего же такой перебор памяти?

Может отказаться от длинных варчаров? Сейчас многие поля заданы как длинная строка VARCHAR(2000), неужели придётся урезать осетра? Вот хохма, если IBX отводит память сразу под все символы с запасом.

Или поможет ClientDataSet? Выкачать разок и не перечитывать. Интересно, переедает ли он память.

Может быть у IBQuery есть какие-то настройки, через которые можно подкрутить кеширование.

Неужели придётся устроить такое уродство - незаметно патчить запрос и подставлять туда FIRST/SKIP? Не хотелось бы.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 07 июл 2008, 19:46

Можно и на клиента вытянуть - я как-то вполне успешно использовал для этого TMemTableEh из EhLib-а.
Сортировка на таких объёмах будет летать. :)

Только задумайся, а что будет, когда размер этой табличы станет в 10-100 раз больше? А если не только её размер, но и ещё нескольких?
Твоя в память перестанет влезать. :)

А клиенты очень быстро научаются пользоваться фильтрами, а не мотать бесконечные гриды - оно быстрее работать получается. :)

Ответить