Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    jonikDk
    Ну все очень легко, очень бы хотелось, чтобы в том же примере, что написал jonikDk, было так. Доходишь до 101 записи, DOA подгружает еще 50 записей, а первые 50 удаляет из памяти. Было бы точно очень удобно. Правда конечно было бы ограничение не по 100 записей в буфере, а думаю тысячи на 2, но все же.  
    Просто часто бывает так, что клиентам хочется как бы видеть сразу "все" записи на экране и не пользоваться никакими фильтрами и поисками (а поиск только Ctrl+F - типа из-за разряда, если Ёксель так умеет, то почему ваша программа не умеет. И не я не могу доказать, не бизнес-аналитики это этим тетенькам в 70 лет). А число транзакций по счетам может достигать и 70000 в обычный день и в последний день месяца под лям в день.  


    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 10:24 09-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    да пожалуйста
    1 вариант - курсор в пакете.  
    2. вариант  поле rownum
    а вобщето рекомендую почитать Кайт'а
    _http://www.oracle.com/global/ru/oramag/mayjune2007/w_dev_asktom56.html

    Цитата:
    хочется как бы видеть сразу "все" записи на экране  

    понимаете человек с "захода" не сможет обработать визуально более 300-500  
    записей.

    Цитата:
    70000 в обычный день и в последний день месяца под лям в день

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

    Цитата:
    DOA подгружает еще 50 записей, а первые 50 удаляет из памяти

    вы задали запрос базе - получили "кусок" данных. а не весь объем их - так зачем же их удалять?
    Цитата:
    поиск только Ctrl+F

    опять же только 2 варианта
    1. таблица в памяти (kbmemtable)- все данные (+ удобные сортировки на клиенте)
    2. мучать сервер запросами

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 10:36 09-03-2010 | Исправлено: greenpc, 10:52 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    Батько Кайта читал раньше регулярно, сейчас пока собственных знаний на стороне оракла хватает.  
    1. По поводу курсора и rownum это все понятно и знаю как пишеться и делается.  
    2. Ну все эти бабушки типа так привыкли работать и переучиваться они не хотят. Или как они выражаются - "не учите нас работать".  
    По поводу того, зачем удалять записи из памяти? А все очень легко - например 50000 записей при 30 столбцах в TOracleDataSet - это примерно гиг оперативной памяти. Столько же занимает памяти в режиме Fast и в TkbmDataSet. Если поставить режим Small, то это будет мегов 100, что тоже не особо хорошо.
    Если пользоваться еще и группировкой в девовском гриде, то добавить еще метров 300. Вот так.  
    Вообще и так понятно, что бабулек надо выгонять либо переучивать, бизнес-аналитиков менять, но я скорее сам уволюсь, чем это измениться. Так что вот и пытаюсь найти решение, так как видел где-то в инете демки (в виде видео) на эту тему (было лет 10 назад) и там практически прозрачно все работало (бесшовно) и памяти ело все очень мало (а табличка было на несколько лимонов записей).

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 10:50 09-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003

    Цитата:
    группировкой в девовском гриде

    если он не в gridMode - то считаете что все данные у вас в памяти без всяких делений по 1000

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 10:58 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    Это я знаю, но кстати их метори тэйбл хорошо относиться к памяти, так же как и TkbmMemDataSet в режиме Small.
     
    Кстати, а чем отличается включенный GridMode от выключенного?


    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 11:01 09-03-2010
    jonikDk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    ну выбора особо нет: либо все записи показывать - много оперативы, либо по частям.  
    Оператива по деньгам сейчас не проблема. Закачивай все в cxGrid и дальше пусть делают все тоже самое что и в эксель.  
    Либо может действительно сделать в отдельном потоке подгрузку записей ?  
    Про выгрузку записей если честно не понял, зачем выгружать то что уже посмотрели, вдруг эти записи понадобятся еще раз? Что их заново подгружать ?
     
    Кстати однонаправленный курсор это не оно ?? Только с гридом он по моему не очень дружит

    Всего записей: 1604 | Зарегистр. 01-03-2004 | Отправлено: 11:05 09-03-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KurkSS

    Цитата:
    Type incompatable TMyObjects and Integer
    Приведенный мной код прекрасно откомпилировался в D7.

    Цитата:
    все переменые которые функциями длл создаються:
    1)Доступны напрямую из программы? ведь нет
    Распределением памяти под "объекты" должна управлять исключительно dll. Иначе допустим у вас dll будет на делфи, а программа скажем на джава. Как вы в этом случае собираетесь распределять память?

    Цитата:
    2)если длл выгрузить то ведь и данные тютю....
    Можно реализовать пару методов, которые будут сохранять и загружать массив рекордов в предоставленный буфер. Будет что то на подобие GetFirst/SetFirst (вообще это тема отдельного разговора). Главное, чтобы программа не пыталась менять эти данные самостоятельно.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:08 09-03-2010 | Исправлено: Frodo_Torbins, 11:12 09-03-2010
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Не делать первую фильтрацию, фильтровать при условии 2 и более буков  

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

    Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 11:16 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    jonikDk
    По поводу какой выгрузки записей? Я не понял.  
     
    А так, как я понимаю, что в принципе нормального решения нет. Вероятнее всего надо двигаться в сторону кэширования на диске клиентной стороны, но пока еще не догадался как.
     
    Да я уже практически забил на все это, надо просто чтоб нормально за меня общался бизнес-аналитик и все. Я уже задолбался ругаться.  
    А так, я пока сделал возможность (переписал чуть класс девовского грида) поиска по Ctrl+F и выделения по столбцам. Жаль что не могу нормально изменить глюк в девовском гриде с выделением строчек по Ctrl, приходить каждый раз править исходник в девках.

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 11:21 09-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    вкраце - все прелести грида - происходят на клиенте (групировка, фильтр..) в памяти
    а так как обычный dbgrid

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:22 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    Дык и при выключенном GridMode абсолютно так же. Стало быть, чего я не понимаю?

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 11:25 09-03-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
     
    Компоненты, которыми пользуетесь для доступа к БД - в исходниках? Если да, то попробуйте скомпилировать проект не с готовыми dcu, а непосредственно с исходниками, и оттрасируйте узкое место в отладчике - на чем именно "тормоза": на выполнении запроса, на выборке записей на клиента, еще на чем? Только после выяснения того, где именно "тормоза", имеет смысл говорить об оптимизации.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 11:26 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    Открыл хэлп, в принципе по идее, очень интересно.
     

    Код:
     
    When using grid mode, the data controller loads a fixed number of dataset records into memory. The number of records to be loaded depends on the GridModeBufferCount property value. A user is permitted to perform data-related operations on the loaded records only. The automatic sorting, filtering, summary calculations and smart refresh features are not supported in grid mode. These features need to be handled manually by handling the appropriate events of the data controller.
     
    To activate grid mode, set the data controller’s GridMode property to True. This data controller mode is deactivated though when you group records within a View. In this case, the data controller switches to default data loading mode.
     

    Но очень смущает то, что все внутренние автоматические функции отключаются и надо все делать руками в любом лсучае.

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 11:29 09-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    как раз то что я вам сказал
    Цитата:
    выключенном GridMode абсолютно так же

    значит гдето у вас стоит "получить все записи" queryallrecords

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:47 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    Ну стало быть, если происходит то, что происходит. Значит стоит в DOA такая галочка, как я понимаю


    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 11:49 09-03-2010
    lingus



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день.
    Не подскажете какой-нибудь дельфи-опенсорс-проект который можно было бы посмотреть с целью самообразования и изучения? Паттерны - построение интерфейсов - взаимосвязь модулей.

    Всего записей: 73 | Зарегистр. 08-05-2008 | Отправлено: 11:52 09-03-2010
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Тормоза-то не всегда случаются. С одной и той же буквой на одном запуске программы выборка по фильтрации и 10 секунд может происходить. Потом с ней же на следующем запуске все мгновенно отработает. И опять же с ней же на 3-й раз - снова тормоза. Почему и трассировку сделать затруднительно. Сейчас вот спецом три раза запустил программу и с каждым символом в алфавите прогнал - тормозов нет, лишь кратенькие задержки с некоторыми символами. Судя по исходникам на выборке из БД.

    Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 11:55 09-03-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    По поводу того, зачем удалять записи из памяти? А все очень легко - например 50000 записей при 30 столбцах в TOracleDataSet - это примерно гиг оперативной памяти.

    Это что за ппц? Каждое поле у вас по 6,5 кб памяти жрёт?

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 12:20 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AviDen
    Да так уж сделан великий и могучий TDataSet, который является основой для TOracleDataSet. Там все записи идут через TObjectList. Да хотя и сам TList - еще та фигня.

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 12:25 09-03-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz, если б это был не firebird, а ms sql server, я бы объяснил причину быстрой работы повторной фильтрации с тем же выражением фильтра наличием требуемых данных в кеше. Но иногда они вытесняются другими (с базой-то и другие юзеры работают!) и тогда серваку приходится запрашивать данные для фильтрации не их оперативы, а с диска. Частично решается 1) увеличением отводимой процессу сервера памяти 2) оптимизацией структуры таблицы, по которой делается поиск (кстати, я ж думаю, индекс по искомому полю-то у вас есть?)
     
    А вообще, я бы всё делал в точности, как написал VadimLou - фильтровал хотябы от 2 (лучше 3) букв и подтягивал не более N записей, остальные - либо с задеркой, либо при попытке пользователя погулять по гриду.
     
    Добавлено:
    Cryogen2003, стандартный TDataSet НИКАК не определяет форматы хранения выбранных с сервера данных и практически не предъявляет никаких требований к их кешированию. Он вообще жестко не задаёт никаких рамок ни для каких аспектов манипулирования данными (выборка, кеширование, хранение, модификация, навигация и пр.). Всё это - прерогатива конкретного наследника.
     
    С оракловскими БД я, к сожалению, не работал, поэтому сказать ничего определённого не могу. Но как-то я сильно сомневаюсь, чтобы там захаркодено было на каждое поле (любого типа) каждой записи выделять over 6КБ данных, ибо это попахивает маразмом. Может, имелся в виду какой-то конкретный пример?

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 12:30 09-03-2010
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru