Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DOA, TOracleDataSet кэширование данных. / 16 сообщений из 16, страница 1 из 1
01.10.2003, 15:25
    #32280891
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
Привет.
Подскажите как решить вот такую вот проблемку:
Есть хранимая процедурка, которая возращает курсор. Из которого при помощи TOracleDataSet выбираются данные. Опция у датасета QueryAllRecords := false;
Выборка достаточно большая, возможно нескошлько тысяь записей.
Так вот помере выборки датасет начинает раздуваться (кушать больше памяти). И концу выбори он занимает достаточно много места от 70 до 200 мегабайт все зависит от объемов выборки. Память освобождается, когда я делаю этому датасету free. Вероятний всего что это происходит из-за того что датасет кэширует выбранные данные. Так вот вопрос как избавится от этого кэширования. Порылся в хэлпи ничего не нашел.

Зарание благодарен за помощь.
...
Рейтинг: 0 / 0
01.10.2003, 15:31
    #32280905
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
>> ... помере выборки датасет начинает раздуваться (кушать больше памяти). И концу выбори он занимает достаточно много места от 70 до 200 мегабайт все зависит от объемов выборки ...

Всё правильно: так и должно быть.
Если жалко память, то указывай явно WHERE ROWNUM ....

При QueryAllRecords = True у тебя выберутся все данные сразу (точнее, перекачаются на клиента). А так - постепенно. Кэш здесь ни при чем.
...
Рейтинг: 0 / 0
01.10.2003, 15:39
    #32280916
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
>>Всё правильно: так и должно быть.
>>Если жалко память, то указывай явно WHERE ROWNUM ....

>>При QueryAllRecords = True у тебя выберутся все данные сразу (точнее, >>перекачаются на клиента). А так - постепенно. Кэш здесь ни при чем.
Так вот мне надо избежать что бы он сохрнял уже полученные данные.
...
Рейтинг: 0 / 0
01.10.2003, 15:41
    #32280919
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
Мне надо просто получать данные из курсорав и обрабатывать их.
Если есть варинт без испольования TOracleDataSet. Подскажите.
хранимая процедура возращает
type ResultSet is Ref Cursor;
...
Рейтинг: 0 / 0
01.10.2003, 15:44
    #32280923
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
Перепиши процедуру. Передавай в нее параметры FIRST_RECORD и LAST_RECORD. Ну и в курсоре
...
where rownum>first_record-1
and rownum<last_record
...

Только придется вызывать ее при перемещениях по датасету.
...
Рейтинг: 0 / 0
01.10.2003, 15:46
    #32280926
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
А почему бы не обрабатывать данные на сервере?
...
Рейтинг: 0 / 0
01.10.2003, 15:48
    #32280930
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
мдя,
это конечно решение. Но дергать кусками не охото. Т.е. надо доп проверки. Достигнут ли конец текущего блока и т.д.
Не хотелось бы так делать. Движение по дата сету только в перед т.е. всегда вызвается Next. Мне надо просто получить данные из курсора в один проход и обработать положить их в другое место.
...
Рейтинг: 0 / 0
01.10.2003, 15:49
    #32280933
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
А не обрабатывать потому что они отображаюся клиенту
...
Рейтинг: 0 / 0
01.10.2003, 15:54
    #32280941
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
А что клиент делает с 200 мегабайтами информации???

Уж не запомнить-ли пытается?

Передавай только то, что нужно: уже подготовленные к просмотру данные.
...
Рейтинг: 0 / 0
01.10.2003, 15:57
    #32280951
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
не 200 Метров, это данные отчета с информацией о форматирование.
Отчеты могут быть достаточно большие на нескольких листах(есть отчет на 25 листах) (Excel) а на каждом листе по несколько сотен строк.
...
Рейтинг: 0 / 0
01.10.2003, 16:00
    #32280957
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
причем в отчетах может достаточно много колонок, в среднем 10, а теперь представляшь и для каждой ячейки может быть задано форматирование, вот отсюда и 200 метров
...
Рейтинг: 0 / 0
01.10.2003, 16:00
    #32280959
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
Могу ошибаться , но в Delphi, все загруженные в TDataSet данные, остаются в оперативной памяти пока не сделать Free или Refresh, и отключить это по-моему никак нельзя. TOracleDataSet просто наследует это поведение...
Поэтому, могу посоветовать вытаскивать по одной записи, а от DBGrid отказаться...
...
Рейтинг: 0 / 0
01.10.2003, 16:04
    #32280966
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
m_kus, да ты прав в Delphi, все загруженные в TDataSet данные, остаются в оперативной памяти пока не сделать Free,TOracleDataSet просто наследует это поведение...
Про отключить я как раз и спрашиваю.
Да я и вытаскиваю по одной записи из курсора при помощи датасета. А дергать по одной записи из базы, это уж слишком.
ВBGrid не юзаю.
Все помещается в Эксэль
...
Рейтинг: 0 / 0
01.10.2003, 16:08
    #32280975
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
Тогда могу посоветовать, забраться в исходники TDataSet и TOracleDataSet, найти реализацию метода Next и вставить явное удаление ненужных записей.
...
Рейтинг: 0 / 0
02.10.2003, 09:13
    #32281423
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
2Anton K
Я так и не понял в чем проблема у тебя.

>Выборка достаточно большая, возможно нескошлько тысяь записей.
Так вот помере выборки датасет начинает раздуваться (кушать больше памяти). И концу выбори он занимает достаточно много места от 70 до 200 мегабайт все зависит от объемов выборки.
А как должно быть? Ты выбираешь с сервака 200М данных куда? В память клиентской машины. Вот она и занимается.

>Память освобождается, когда я делаю этому датасету free.
Ну дык и в чем проблема? Если бы не освобождалась, тогда да, а так...

Почему бы (если хочешь экономить память) не отказаться от Экселя, и не сваять отчет самому - тогда и рулить можно гораздо большим. Например порциями закачиваемой инфы.
...
Рейтинг: 0 / 0
02.10.2003, 12:37
    #32281799
Anton K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOA, TOracleDataSet кэширование данных.
Кому интересно, проблему решил воспользовавшись TOracleQuery. Оне не кэширует данные при выборе из курсора...Как говориться rtfm - надо было внимательней делать.
Using a cursor variable as a TOracleQuery
Because a cursor variable is equivalent to a TOracleQuery with a select statement, DOA implements the cursor variable type as a TOracleQuery.
Хотя они предлагают работать с курсором и на базе TOracleDataSet, просто граница между ними не очень хорошо определена. Это меня и сбило с толку.

Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DOA, TOracleDataSet кэширование данных. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]