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

Вниз

Out of memory On data fetching   Найти похожие ветки 

 
DelphiN! ©   (2005-12-22 06:36) [0]


 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 записей. Как с этим боротся


 
Digitman ©   (2005-12-22 08:22) [1]


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


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


 
DelphiN! ©   (2005-12-22 08:31) [2]


>  [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+"""";


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


 
DelphiN! ©   (2005-12-22 08:33) [3]

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


 
Digitman ©   (2005-12-22 08:47) [4]

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

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


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


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

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


 
DelphiN! ©   (2005-12-22 09:06) [6]


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


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


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


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


 
Johnmen ©   (2005-12-22 09:12) [7]

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


 
Johnmen ©   (2005-12-22 09:12) [8]

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


 
DelphiN! ©   (2005-12-22 09:16) [9]


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


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


 
Digitman ©   (2005-12-22 09:20) [10]


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


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

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


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


попробуй ..

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


 
DelphiN! ©   (2005-12-22 09:28) [11]


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


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


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


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

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


 
DelphiN! ©   (2005-12-22 09:40) [13]


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


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


 
evvcom ©   (2005-12-22 09:51) [14]


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

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


 
DelphiN! ©   (2005-12-22 09:53) [15]


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


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


 
Anatoly Podgoretsky ©   (2005-12-22 10:24) [16]

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



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

Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.017 c
2-1135153839
nirvana
2005-12-21 11:30
2006.01.08
Защита базы данных


4-1131016966
Ромка
2005-11-03 14:22
2006.01.08
Серийный номер материнки


2-1135237508
kyn66
2005-12-22 10:45
2006.01.08
RoundTo работает неверно?


3-1131961081
Kurillka
2005-11-14 12:38
2006.01.08
Как сгруппировать след. запрос?


2-1134898227
з. танька
2005-12-18 12:30
2006.01.08
TWebBrowser





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский