![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про 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]
В конкретном примере нет ничего лишнего.
В чем собственно вопрос не очень понятно.