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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen
    Индекс, конечно, есть.
    Я уже и сам склоняюсь к предложению подтягивать определенное кол-во записей. Но вот хотелось бы дождаться ответа уважаемого ShIvADeSt касательно некоего LookupBox'а, с которым, если верить, проблем быть не должно

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 12:49 09-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    select count(*) from table  
    -- 773762
    колонок 37
    вылелено памяти 513232 кб
    стандартные поля без экзотики (типа clob ...)
    время выполнения 138 сек. 1 connect

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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AviDen
    А причем тут форматы хранения данных? Я думаю что просто дело в другом, что в TDataSet все храниться как объекты, что на каждый Row свой объект, в котором куча объектов в виде колонок. В этом и проблема дикого расхода памяти.  
    А пример, да в принципе любой пример, попробуйте открыть хотя бы в TkbmMemDataSet огромную таблицу. И посмотрите что будет с расходом памяти.
    А так, мы уже начали офтопить.
     
    Добавлено:
    greenpc
    Круто  
    А в какой компонент все грузили? Какие настройки у этого компонента?

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

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



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

    Цитата:
    уважаемого ShIvADeSt касательно некоего LookupBox'а, с которым, если верить, проблем быть не должно

    Lookup от девок умеет такое

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003, ещё раз скажу (как человек, написавший свой набор компонент для доступа к данным, в т.ч. и наследника от TDataSet), что сам TDataSet не предъявляет абсолютно никаких требований к тому, как хранить данные. Это всё решает конкретный наследник. Но и в то, что TOracleDataSet (который писался ведь неглупыми людьми) так тупо выделяет память, тоже как-то не верится.
     
    Скорее всего, у тебя была таблица с тремя десятками строковых полей максимально возможной длины (не знаю, какое там ограничение в оракле, в сиквелле это 8КБ). Поэтому для КАЖДОГО из них в КАЖДОЙ строке выделялась память под максимально возможную длину (независимо от реального размера данных в конкретной строке/поле). Ну, понятно, это лишь предположение (хотя описанное поведение при выделении памяти как раз и меет место быть в TADODataSet'е в режиме клиентского курсора).

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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AviDen
    Ну скажем так, все данные в приложение поступают как раз через процедуры с получаемый курсором. Возможно в этом и есть собака.

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

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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    DOA 4.1.1 D7
    TOracleDataSet
    настроки по умолчанию, кроме QueryAllRecords =True;

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz, а firebird умеет делать выборку исключительно из индекса (если, напр., я выбираю поле А, с фильтром по тому же полю А и у меня при этом в таблице есть индекс по этому полю)? сиквелл - умеет, благодаря чему в ряде случаев удается сократить кол-во обращений к диску (т.к. индекс, как правило, занимает меньше страниц памяти, чем таблица)? Если нет (или в данном случае так по каким-лю причинам этого не происходит) - нужно выбросить из таблицы лишние поля, чтобы при выполении того запроса перелопачивалось меньше страниц. Ну, т.е., удалять поля не нужно, но ведь можно создать отдельную табличку, содержащую минимальный набор полей для выборки, и обращаться к ней (правда, чтогда её нужно будет синхронизировать с основной, но это легко делается триггерами).

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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    То есть QueryAllRecords у вас установлена в True?
    Как именно данные получаются у вас? Просто через SQL или как запуск с процедуры с возвращяемый курсором?

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

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



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

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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    я просто привел пример сколько используется памяти датасетом
    запрос через sql. QueryAllRecords =true, чтобы получить все данные.
    но так стараюсь не делать. лучше получить "кусочки" по необходимости
    формат полей если интерен виден при редактировании сообщения  
    если интересно сделаю
    Цитата:
    с процедуры с возвращяемый курсором


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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    AviDen
    Кстати, ради интереса проверил сейчас. Если получать данные через просто SQL, то все активные карты банка (select count(1) from cf_import.creditcard_creditcard - count(1) - 841104) заняли в памяти (все приложение) 650951KB. Когда попытался загрузить через процедуру и курсор, то тупо комп в синий экран свалился при занятой памяти в 2 гига). Когда пользовался в прошлой году DOA 3.xx (не помню точно какой версией пользовался) было без разницы как получаешь данные (через курсор или просто SQL), то теперь в DOA 4.1.1 разница есть. Как-то очень странно все это.
    Если интересует сам селект для получения данных, то вот он:
    Сам селект

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

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



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Контрол стандартный - DBLookupComboBox, ищет по первым буквам первое вхождение и позиционирует курсор в выборке на нем. Либо можно использовать более расширенный вариант из RxLib (JEDI имхо через чур перегружен). Так же буковки можно ввести в RxLookupEdit. Но судя по тому, что нужно Вам - обычного лукапа за глаза.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:02 10-03-2010
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйсто. Delphi 2006, код целиком, Work персистент.

    Код:
     
    procedure TfmMain.HelpTop1Execute(Sender: TObject);
    label
      4;
    var
      My: (TPinHttpWork);
    begin
      goto 4;
      MessageDlg('dfgdfg', mtWarning, [], 0);
    4:
      My := TPinHttpWork.|Create;
      try
        //My;
      finally
        My.Free;
      end;
    end;
     

    Компилятор говорит
    [Pascal Error] sbzMain.pas(156): E2018 Record, object or class type required
    Я не разберусь, строка 156 там где | мигает.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 14:53 10-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    delover
    а у класа TPinHttpWork
    конструктор Create параметры имеет?

    Цитата:
    var  
      My: (TPinHttpWork);  
     
    а почему в скобках

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    delover
    Да странный какой то синтаксис. Без скобок компилируется.

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 15:19 10-03-2010
    Odysseos



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

    Код:
     
      My: (TPinHttpWork);
     

     
    - зачем в скобках? Вы понимаете, зачем в описании типа данных скобки используются? (Подсказываю - для создания перечисления.)

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 15:34 10-03-2010
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    - спасибо. я просто всё забыл...
     

    Код:
     
    procedure TfmMain.FormDestroy(Sender: TObject);
    var
      E: TCollectionEnumerator;
      P: Pointer;
    begin
    {
    Licence :
    This software is provided 'as-is', without any expressed or implied
    warranty. In no event will the author be held liable for any damages
    arising from the use of this software.
    Permission is granted to anyone to use this software for any kind of
    application, and to alter it and redistribute it freely, subject to
    the following restrictions:
    1. The origin of this software must not be misrepresented, you must
       not claim that you wrote the original software.
    2. Altered source versions must be plainly marked as such, and must
       not be misrepresented as being the original software.
    }
      E := TCollectionEnumerator.Create(ButtonGroup1.Items);
      try
        while E.MoveNext do TBaseButtonItem(E.Current).Action := nil;
      finally
        E.Free;
      end;
      P := @GSocketListClass;
      Inc(LongWord(P), 8);
      Sys.FreeAndNil(TObject(P^));
      Sys.FreeAndNil(GThreadCount);
    end;
     

     
    Правильно ли я коммеентарий вставляю? C кнопками вроде понятно, а с IdStack, у меня мало опыта.
     
    Добавлено:
    Всё время путаю, в разделе какие вы знаете программы - пишу виндовс.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 17:40 10-03-2010
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    О.. Уже начинает получаться
    Что-то типа такого же, только цифирки некоторые подправил
    [code]
    '//63002:2006.03.01:1:1234567890:++(01):-:-:-:-:66000.000:0:65680.000:0:65640.000:0:65820.000:0:65660.000:0:62240.000:0:59660.000:0:59440.000:0:59140.000:0:59180.000:0:59360.000:0:58880.000:0:58820.000:0:59340.000:0:59160.000:0:58860.000:0:58600.000:0:58560.000:0:58580.000:0:58620.000:0:58360.000:0:58400.000:0:58420.000:0:58880.000:0:59340.000:0:59100.000:0:58640.000:0:58960.000:0:58800.000:0:59280.000:0:58840.000:0:58580.000:0:58860.000:0:60780.000:0:58680.000:0:58860.000:0:58680.000:0:58620.000:0:58640.000:0:58300.000:0:59080.000:0:58620.000:0:58700.000:0:58440.000:0:58820.000:0:58920.000:0:58640.000:0:58780.000:0:=='
    '//63002:2006.03.01:2:1234567890:++(01):-:-:-:-:28720.000:0:29120.000:0:29680.000:0:29880.000:0:30220.000:0:28840.000:0:27000.000:0:28860.000:0:27860.000:0:27260.000:0:26920.000:0:27120.000:0:26560.000:0:25720.000:0:25860.000:0:27060.000:0:27220.000:0:27320.000:0:26540.000:0:27060.000:0:27800.000:0:27360.000:0:27860.000:0:27060.000:0:27060.000:0:27240.000:0:27340.000:0:27260.000:0:28160.000:0:27440.000:0:27800.000:0:28040.000:0:27000.000:0:25880.000:0:27560.000:0:27700.000:0:27660.000:0:26740.000:0:26620.000:0:27560.000:0:26840.000:0:27320.000:0:27560.000:0:27720.000:0:27200.000:0:27900.000:0:27640.000:0:27700.000:0:=='
    [/code]
    Так блин с комментарием так и не пойму... Помогите плиз...
     
    Добавлено:
    Упростил.
    Добавлено:
    Напоминаю - кнопка редактировать.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 20:40 10-03-2010 | Исправлено: delover, 14:18 12-03-2010
    greenpc

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

    Цитата:
    Правильно ли я коммеентарий вставляю

    F1 - Comments

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 08:58 11-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