Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Out of memory On data fetching


DelphiN! ©   (2005-12-22 06:36:00) 


 DATA.State.SelectSQL.Text := 'SELECT * FROM STATE where City_ = 'Almaty' and TIME_ >= '''+DateToStr(edtDateS.Date)+' '+edtTimeS.Text+''' and TIME_ <= '''+DateToStr(edtDatePo.Date)+' '+edtTimePo.Time+'''';
 DATA.State.Open;
 DATA.State.First;
 while not DATA.State.Eof do
 begin
   b := false;
   for i := 0 to strl.Count-1 do
     if DATA.CmpStr(DATA.State.FieldByName('City_').AsString+':'+DATA.State.FieldByName('Organization_').AsString,strl.Strings[i ]) then
       b := true;
     if not b then
       strl.Add(DATA.State.FieldByName('City_').AsString+':'+DATA.State.FieldByName('Organization_').AsString);
   DATA.State.Next;
 end;


После очередного вызова DATA.State.Next вылетает Out of memory. Запрос выводит не более 10 000 записей. Как с этим боротся


Anatoly Podgoretsky   (2005-12-22 10:24:00) [1]

Начать с переписывания кода согласно приведеным рекомендация, особенно по бездумной трате памяти.


DelphiN!   (2005-12-22 09:53:00) [2]


>  [14] evvcom ©   (22.12.05 09:51)


Спасибо, буду иметь ввиду


evvcom   (2005-12-22 09:51:00) [3]


> А чем имеющийся вариант может проигрывать по скорости, тому
> вырианту где все передается через параметры?

Во-первых, после каждого изменения запроса, его надо заново парсить, а это как раз время.
Во-вторых, на серверах имеется буфер для хранения распарсенных запросов, и Интербейз, я думаю, тоже не исключение. При изменении всего одного значения того, что могло бы быть параметром, ты получаешь новый запрос, и уменьшается свободное место в этом буфере.


DelphiN!   (2005-12-22 09:40:00) [4]


>  [12] evvcom ©   (22.12.05 09:34)


Слышал, так просто привычней как-то. А чем имеющийся вариант может проигрывать по скорости, тому вырианту где все передается через параметры?


evvcom   (2005-12-22 09:34:00) [5]


>  а [2] ведь нормальный

да тоже ненормальный. Ты про параметры что-нибудь слышал? И какова необходимость генерить динамически SQL?


DelphiN!   (2005-12-22 09:28:00) [6]


>  [10] Digitman ©   (22.12.05 09:20)


Огромное спасибо!


Digitman   (2005-12-22 09:20:00) [7]


> чем так плохи компоненты IbExpress?


Сыроваты они ..
Да и функциональность оставляет желать лучшего ..

FIBPlus на фоне IBExpress выглядит гораздо привлекательней, хотя бы потому что разработчики пакета достаточно оперативно реагируют на выявленные пользователями баги


> как насчет ibDataSet.UniDirectional := true


попробуй ..

в принципе установка этого св-ва у любого из соотв.компонентов любого пакета приводит к одному и тому же результату - вызову соотв. IBAPI-ф-ции с соотв.параметрами


DelphiN!   (2005-12-22 09:16:00) [8]


>  [8] Johnmen ©   (22.12.05 09:12)


про [0] я ничего и не говорю, просто из старого проекта вырезал, и ради примера привел, а [2] ведь нормальный


Johnmen   (2005-12-22 09:12:00) [9]

Кстати, код крайне неэффективен.


Johnmen   (2005-12-22 09:12:00) [10]

Удалено модератором


DelphiN!   (2005-12-22 09:06:00) [11]


>  [5] evvcom ©   (22.12.05 09:01)


Понятное дело


> [4] Digitman ©   (22.12.05 08:47)


А чем так плохи компоненты IbExpress? А как насчет ibDataSet.UniDirectional := true(меня интересует именно 1 проход по НД)?


evvcom   (2005-12-22 09:01:00) [12]


> что делать если под условие подходит большое колличество записей?

1. Вообще-то "количество" всегда писалось с одной "л".
2. Удаление из набора повторов проще действительно возложить на SQL и DISTINCT.
3. Код [0] написан оченьнеоптимально, что ведет за собой дополнительные, ненужные, холостые запросы на выделение памяти.
4. Не знаю, как там устроен интербейсовский DataLink, а разбираться лень, да и не к чему мне это, но похоже, что при очередном запросе на выделение памяти во время исполнения Next, менеджер не может выделить единого куска требуемого размера. Отсюда и сабж.


Digitman   (2005-12-22 08:47:00) [13]

1. лучше отказаться от компонентов IBExpress в пользу пакета FIBPlus

2. если нужно однократно пробежать по НД в направлении от первой записи к последней, то используй TFIBQuery c установленным св-вом Unidirectional = True - однонаправленный НД ощутимо менее ресурсоемкий, нежели НД с двунаправленным курсором


DelphiN!   (2005-12-22 08:33:00) [14]

Кстати забыл указать, что использую ibDataSet


DelphiN!   (2005-12-22 08:31:00) [15]


>  [1] Digitman ©   (22.12.05 08:22)


В стринг листе мало элементов (меньше 10-ти). Вылетает, когда кончается оперативная память(примерно после перехода на 7-ми тысячный элемент). Может можно какнибудь освобождать память? Кстати речь не только об этой ситуации, а вообще о выборке большого колличества записей. Конкретно данный пример можно решить скажем так :


DATA.State.SelectSQL.Text := 'SELECT DISTINCT City_,Organization_ FROM STATE where City_ = 'Almaty' and TIME_ >= '''+DateToStr(edtDateS.Date)+' '+edtTimeS.Text+''' and TIME_ <= '''+DateToStr(edtDatePo.Date)+' '+edtTimePo.Time+'''';


так как при данном запросе выводится не большое колличества записей память не кончается, а что делать если под условие подходит большое колличество записей?


Digitman   (2005-12-22 08:22:00) [16]


> После очередного вызова DATA.State.Next


после какого конкретно "очередного" ?
и сколько элементов в этот момент уже добавлено тобой в стринг-лист ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо