Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
Привет. Подскажите как решить вот такую вот проблемку: Есть хранимая процедурка, которая возращает курсор. Из которого при помощи TOracleDataSet выбираются данные. Опция у датасета QueryAllRecords := false; Выборка достаточно большая, возможно нескошлько тысяь записей. Так вот помере выборки датасет начинает раздуваться (кушать больше памяти). И концу выбори он занимает достаточно много места от 70 до 200 мегабайт все зависит от объемов выборки. Память освобождается, когда я делаю этому датасету free. Вероятний всего что это происходит из-за того что датасет кэширует выбранные данные. Так вот вопрос как избавится от этого кэширования. Порылся в хэлпи ничего не нашел. Зарание благодарен за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:25 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
>> ... помере выборки датасет начинает раздуваться (кушать больше памяти). И концу выбори он занимает достаточно много места от 70 до 200 мегабайт все зависит от объемов выборки ... Всё правильно: так и должно быть. Если жалко память, то указывай явно WHERE ROWNUM .... При QueryAllRecords = True у тебя выберутся все данные сразу (точнее, перекачаются на клиента). А так - постепенно. Кэш здесь ни при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:31 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
>>Всё правильно: так и должно быть. >>Если жалко память, то указывай явно WHERE ROWNUM .... >>При QueryAllRecords = True у тебя выберутся все данные сразу (точнее, >>перекачаются на клиента). А так - постепенно. Кэш здесь ни при чем. Так вот мне надо избежать что бы он сохрнял уже полученные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:39 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
Мне надо просто получать данные из курсорав и обрабатывать их. Если есть варинт без испольования TOracleDataSet. Подскажите. хранимая процедура возращает type ResultSet is Ref Cursor; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:41 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
Перепиши процедуру. Передавай в нее параметры FIRST_RECORD и LAST_RECORD. Ну и в курсоре ... where rownum>first_record-1 and rownum<last_record ... Только придется вызывать ее при перемещениях по датасету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:44 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
А почему бы не обрабатывать данные на сервере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:46 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
мдя, это конечно решение. Но дергать кусками не охото. Т.е. надо доп проверки. Достигнут ли конец текущего блока и т.д. Не хотелось бы так делать. Движение по дата сету только в перед т.е. всегда вызвается Next. Мне надо просто получить данные из курсора в один проход и обработать положить их в другое место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:48 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
А не обрабатывать потому что они отображаюся клиенту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:49 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
А что клиент делает с 200 мегабайтами информации??? Уж не запомнить-ли пытается? Передавай только то, что нужно: уже подготовленные к просмотру данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:54 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
не 200 Метров, это данные отчета с информацией о форматирование. Отчеты могут быть достаточно большие на нескольких листах(есть отчет на 25 листах) (Excel) а на каждом листе по несколько сотен строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 15:57 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
причем в отчетах может достаточно много колонок, в среднем 10, а теперь представляшь и для каждой ячейки может быть задано форматирование, вот отсюда и 200 метров ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 16:00 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
Могу ошибаться , но в Delphi, все загруженные в TDataSet данные, остаются в оперативной памяти пока не сделать Free или Refresh, и отключить это по-моему никак нельзя. TOracleDataSet просто наследует это поведение... Поэтому, могу посоветовать вытаскивать по одной записи, а от DBGrid отказаться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 16:00 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
m_kus, да ты прав в Delphi, все загруженные в TDataSet данные, остаются в оперативной памяти пока не сделать Free,TOracleDataSet просто наследует это поведение... Про отключить я как раз и спрашиваю. Да я и вытаскиваю по одной записи из курсора при помощи датасета. А дергать по одной записи из базы, это уж слишком. ВBGrid не юзаю. Все помещается в Эксэль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 16:04 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
Тогда могу посоветовать, забраться в исходники TDataSet и TOracleDataSet, найти реализацию метода Next и вставить явное удаление ненужных записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 16:08 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
2Anton K Я так и не понял в чем проблема у тебя. >Выборка достаточно большая, возможно нескошлько тысяь записей. Так вот помере выборки датасет начинает раздуваться (кушать больше памяти). И концу выбори он занимает достаточно много места от 70 до 200 мегабайт все зависит от объемов выборки. А как должно быть? Ты выбираешь с сервака 200М данных куда? В память клиентской машины. Вот она и занимается. >Память освобождается, когда я делаю этому датасету free. Ну дык и в чем проблема? Если бы не освобождалась, тогда да, а так... Почему бы (если хочешь экономить память) не отказаться от Экселя, и не сваять отчет самому - тогда и рулить можно гораздо большим. Например порциями закачиваемой инфы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2003, 09:13 |
|
||
|
DOA, TOracleDataSet кэширование данных.
|
|||
|---|---|---|---|
|
#18+
Кому интересно, проблему решил воспользовавшись 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, просто граница между ними не очень хорошо определена. Это меня и сбило с толку. Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2003, 12:37 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32280941&tid=2116629]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 364ms |

| 0 / 0 |
