Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Про TClientDataSet.


Тимохов ©   (2004-01-20 11:17:00) 

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

Тут возник вопрос в сравнении храктеристик рекордстета собственной разработки и TClientDataSet.

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

with ClientDataSet1 do
begin
with FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := "Field1";
end;
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := 10;
Name := "Field2";
end;
CreateDataSet;
end;
for I := 1 to 100000 do
begin
ClientDataSet1.Fields[0].Value := 1;
ClientDataSet1.Fields[1].Value := "1";
end


(Т.е. создается рекордстет с двумя полями и добавляются сто тыс строк.)


Dred2k   (2004-01-20 17:58:00) [1]

Хм, так после CreateDataSet нужно отключить историю (LogChanges := False). Тогда и длительность операции уменьшается в два слишним раза. (только что проверил специально)

Кроме того, RxMemoryData - не конкурент TClientDataSet-у. В этом я убедился на все 100 - на некоторых операциях производительность Rx... меньше в десятки раз.


Deniz   (2004-01-20 12:39:00) [2]

>Тимохов © (20.01.04 12:03) [11]
Так что-же тогда сравнивать?
Вот таким же образом DBF с Oracle сравнивают :)))
Тогда давай сравним Твой RecordSet(если его так можно назвать) с TList.
Вставка 1 000 000(млн) записей на моем компе занимает 0.265 с.
Для сравнения тест с ClientDataSet и 100 000 занимает 32 с, т.е. не сильно отличается от тех, что у тебя!


Nikolay M.   (2004-01-20 12:08:00) [3]


> Тимохов © (20.01.04 12:03) [11]

Тогда - RxMemoryData или MemoryTable, зачем изобретать велосипед?


Тимохов   (2004-01-20 12:03:00) [4]

Nikolay M. © (20.01.04 11:58) [10]
Индексов нет.
XML нет.
Итории вроде тоже нет.
Таблицы тоже нет.

Все в памяти.


Nikolay M.   (2004-01-20 11:58:00) [5]


> буду считать, что по времени добавления мой рекордсет выигрывает
> в 100 раз, и в 3 раза по памяти. :)))

А у тебя поддержка индексов есть и, как следствие, сортировка НД на лету? Загрузка/выгрузка в/из XML? История редактирования НД (как следствие, возможность делать UNDO)? Не говоря уже про передачу данных в собственно таблицу.

Если вся задача твоего рекордсета - держать в памяти таблицу, рекомендую посмотреть на RX-овые RxMemoryData & MemoryTable.


Тимохов   (2004-01-20 11:51:00) [6]

Ладно, спасибо.
Приятно, что писал свое не зря :)))


Семен Сорокин   (2004-01-20 11:42:00) [7]

Тимохов ©
имхо, зависит от задачи, я тоже давно не использую DB-компоненты, вышепривденный кусок кода я бы просто загнал в TList или его потомка.


Карелин Артем   (2004-01-20 11:40:00) [8]

Тимохов © (20.01.04 11:32) [5]
У IbQuery влияет без контролов.


Тимохов   (2004-01-20 11:34:00) [9]

Проблемы для меня как таковой нет. Обращаюсь к мастерам датабазных компонент дельфи, т.к. сам не в состоянии быстро разобраться с компонентами. Да и нужно это мне лишь для сравнения.

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


Тимохов   (2004-01-20 11:32:00) [10]

К контролам вообще не подвязывался... Только один TClientDataSet.


Карелин Артем   (2004-01-20 11:29:00) [11]

DisableControls может поможет??? А 17 мегов это мало.


Тимохов   (2004-01-20 11:27:00) [12]

Работает это уж как-то ужалающе медленно (40 сек) и памяти много берет (17 мб) :(((


Тимохов   (2004-01-20 11:24:00) [13]

Поясню.
НАпример для TListView есть метод BeginUpdate, который сильно ускоряет добавление элементов.
Вопрос в том, что может здесь тоже что-то есть такое, что надо сделать, чтобы добавление шло быстро?

Задам вопрос с другой стороны: можно ли считать приведенный код наилучшей реализацией задачи - добавить в TClientDataSet, находящийся чисто в памяти, 100000 строк?


Academic   (2004-01-20 11:21:00) [14]

В конкретном примере нет ничего лишнего.
В чем собственно вопрос не очень понятно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо