Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.13;
Скачать: CL | DM;

Вниз

ClientDataSet as memtable - тормозит при добавлении записей   Найти похожие ветки 

 
Alex_C   (2011-12-28 17:57) [0]

Раньше как таблицу в памяти использовать VolgaTable - просто наверное самое лучшее из таблиц в памяти, и почему никто далее не поддерживает? :) Так вот: при добавлении допустим 30 тыс записей в цикле добавление происходило практически моментально. Пробовал использовать для аналогичной цели ClientDataSet  - первые 10 тыс - нормально, потом начинает тормозить. Вопрос - почему?


 
Виталий Панасенко   (2011-12-28 18:08) [1]

своп


 
sniknik ©   (2011-12-28 19:35) [2]

> своп
???
ну и нафига сейчас нужен комп с 64 мег оперативы "на борту"? выкинуть и сразу решатся все проблемы с тормозами...

нет уж, тут что-то другое, я за "кривые руки". кто еще?...


 
Jeer ©   (2011-12-28 21:01) [3]


> потом начинает тормозить.


Треба расшифровки - насколько, в количественном выражении.


 
Ega23 ©   (2011-12-29 10:19) [4]

ClientDataSet.DisableControls;
try
 // Добавляем в него 100500 записей;
finally
 ClientDataSet.EnableControls;
end;  


Так тоже тормозит?


 
Alex_C   (2011-12-29 10:40) [5]


>  я за "кривые руки". кто еще?...


... Борланда? :)
Пустой проект. Есть только ClientDataSet и VolgaTable.
Цикл добавления. Более - ничего.
Время добавления в VolgaTable - 35 тыс записей - около 23 сек. Причем при добавлении еще 35 - 30 сек. У ClientDataSet - 35 сек, еще 35 тыс - 1,5 мин.


 
Alex_C   (2011-12-29 10:41) [6]


> Так тоже тормозит?


Ну я все же не совсем идиот :) Конечно - да)))


 
sniknik ©   (2011-12-29 10:56) [7]

> Ну я все же не совсем идиот :) Конечно - да)))
я про это всегда забываю... когда вижу голословные утверждения. нет ни капли желания проверять. проще верить интуиции про "кривые руки".


 
Ega23 ©   (2011-12-29 13:09) [8]


> Ну я все же не совсем идиот :) Конечно - да)))


Ну вот прикола ради тест наваял:


unit Unit30;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, DBClient, StdCtrls;

type
 TForm30 = class(TForm)
   btnInitCDS: TButton;
   CDS: TClientDataSet;
   btnAdd1000: TButton;
   btnAdd10000: TButton;
   btnAdd100000: TButton;
   lblResult: TLabel;
   btnAdd1000000: TButton;
   procedure btnInitCDSClick(Sender: TObject);
   procedure btnAdd1000Click(Sender: TObject);
   procedure btnAdd10000Click(Sender: TObject);
   procedure btnAdd100000Click(Sender: TObject);
   procedure btnAdd1000000Click(Sender: TObject);
 private
   procedure InitCDS;
   procedure AddNRecords(Value: Integer);
   procedure UpdateResultLabel(tc: Cardinal);
 public
   { Public declarations }
 end;

var
 Form30: TForm30;

implementation

{$R *.dfm}

{ TForm30 }

procedure TForm30.AddNRecords(Value: Integer);
var
 tc: Cardinal;
 i: Integer;
begin
 Screen.Cursor := crHourGlass;
 try
   tc := GetTickCount;
   try
     CDS.DisableControls;
     try
       for i := 1 to Value do
       begin
         CDS.Append;
         try
           CDS.FieldByName("ID").AsInteger := i;
           CDS.FieldByName("Caption").AsString := "AAAA";
         finally
           CDS.Post;
         end;
       end;
     finally
       CDS.EnableControls;
     end;
   finally
     UpdateResultLabel(GetTickCount - tc);
   end;
 finally
   Screen.Cursor := crDefault;
 end;
end;

procedure TForm30.btnAdd1000000Click(Sender: TObject);
begin
 AddNRecords(1000000);
end;

procedure TForm30.btnAdd100000Click(Sender: TObject);
begin
 AddNRecords(100000);
end;

procedure TForm30.btnAdd10000Click(Sender: TObject);
begin
 AddNRecords(10000);
end;

procedure TForm30.btnAdd1000Click(Sender: TObject);
begin
 AddNRecords(1000);
end;

procedure TForm30.btnInitCDSClick(Sender: TObject);
begin
 InitCDS;
end;

procedure TForm30.InitCDS;
begin
 try
   if CDS.Active then
   begin
     CDS.EmptyDataSet;
     CDS.Close;
   end;

   CDS.FieldDefs.Clear;
   CDS.FieldDefs.Add("ID", ftInteger);
   CDS.FieldDefs.Add("Caption", ftString, 30);
   CDS.CreateDataSet;

 finally
   UpdateResultLabel(0);
 end;
end;

procedure TForm30.UpdateResultLabel(tc: Cardinal);
begin
 lblResult.Caption := Format("RecordCount: %d; TotalTime: %d", [CDS.RecordCount, tc]);
end;

end.


 
Ega23 ©   (2011-12-29 13:14) [9]

1000 записей - мгновенно.
10000 записей - 47 мс.
100000 записей - почти 3 секунды (2891 мс).
500000 записей - 82 секунды с волосьями.
Миллион - таки да, надоело ждать.
Но кому нахрен нужно полмиллиона записей????


 
Jeer ©   (2011-12-29 19:53) [10]


> Но кому нахрен нужно полмиллиона записей?


Спасибо, что не затеял тест 1T записей in memory :)


 
Jeer ©   (2011-12-29 19:55) [11]


> просто наверное самое лучшее из таблиц в памяти


Голословно/бездоказательно. "Ф топку" (С)


 
Alex_C   (2011-12-30 09:35) [12]


> Голословно/бездоказательно.


По скорости работы - VolgaTable самая быстрая из всех тестируемых мной таблиц в памяти. По всем показателям - сортировка, вставка. Какое еще доказательство нужно?


> 1000 записей - мгновенно.
> 10000 записей - 47 мс.
> 100000 записей - почти 3 секунды (2891 мс).
> 500000 записей - 82 секунды с волосьями.


Про 100000 ничего не напутал?
У меня так получилось:
1000 - мгновенно.
10000 - 141 мс.
100000 - около 13 сек (ну уж никак не 3 сек!!!)


 
Ega23 ©   (2011-12-30 09:49) [13]


> По скорости работы - VolgaTable самая быстрая из всех тестируемых
> мной таблиц в памяти. По всем показателям - сортировка,
> вставка. Какое еще доказательство нужно?


TSI5TokenDictionary гораздо быстрее. 1.2 миллиона записей грузятся ~ за секунду, поиск - мгновенный. И чо?

Ещё раз: если ты сможешь внятно объяснить, нахрена тебе 100.000 записей в памяти, то можно попытаться найти решение проблемы. Если это тупая блажь, то и разговаривать не о чем.


> Про 100000 ничего не напутал?

Ничего.


 
sniknik ©   (2011-12-30 11:19) [14]

> По всем показателям - сортировка, вставка. Какое еще доказательство нужно?
"сортировка" с созданием локального индекса сравнивается с сортировкой по указателям? ламер. какое еще доказательство нужно?


 
Jeer ©   (2011-12-30 12:03) [15]


> Про 100000 ничего не напутал?
> У меня так получилось:
> 1000 - мгновенно.
> 10000 - 141 мс.
> 100000 - около 13 сек (ну уж никак не 3 сек!!!)


Возможно разные машины.
Мне тоже приходилось заниматься использование таблиц в памяти для достаточно больших объемов.
Сравнивал разные типы и подходы, создав тестовое приложение.

Запустил тот тест и вот, что получил сейчас:
*.FieldDefs.Add(F1, ftInteger, 0, False);
*.FieldDefs.Add(F2, ftString, 64, False);
Без каких-либо индексов, сортировок и ПК

DBISAM
10k - 0.95 s
30k - 6.9 s
50k - 18.3 s
100k - 73 s

FLAT
10k - 0.13 s
30k - 1.0 s
50k - 2.7 s
100k -10.5 s

CDS
10k - 0.28 s
30k - 2.1 s
50k - 4.7 s
100k - 21 s

Понятно, что от тачки зависит еще.


 
Alex_C   (2011-12-30 14:45) [16]


> ламер.


Ругаться не надо. Особенно в перед НГ! :) Девушки любить не будут! :)


> нахрена тебе 100.000 записей в памяти


У радиолюбителей есть разные дипломы. У любителей УКВ - есть диплом - сколько "квадратов" сработанно. Весь мир поделен на 32 тыс. больших квадратов от AA00 до RR99. При выболе диплома названия этих квадратов генерятся в цикле.


 
Jeer ©   (2011-12-30 15:06) [17]


> У радиолюбителей есть разные дипломы.


У программистов - тоже.
Скорее всего Вы что-то не так делаете. Архитектурно  - не так.


 
Jeer ©   (2011-12-31 17:43) [18]


> Весь мир поделен на 32 тыс. больших квадратов от AA00 до
> RR99. При выболе диплома названия этих квадратов генерятся
> в цикле.


Смысла загонять все это в память не видно.
Если стоит задача учета "посещенных" квадратов, достаточно один раз сгенерить таблицу всех 32 тыщ. квадратов в базе и проверять/проставлять признак "наличие".


 
Alex_C   (2012-01-01 23:03) [19]


> Если стоит задача учета "посещенных" квадратов, достаточно
> один раз сгенерить таблицу всех 32 тыщ. квадратов в базе
> и проверять/проставлять признак "наличие".


Вот теперь самое интересное:
давно хотел спросить - как более правильно - 1 раз сгенерить, и потом уже использовать готовую таблицу (так конечно быстрее, но и объем справочной таблицы увеличиться), или генерить? Ранее генерил, т.к. у многих были еще очень маленькие флешки (а моя программа должна с флешки работать). Сейчас уже флешку менее 2 гиг не найти. Правильно я так понимаю сгенерить и сохранять все в справочной БД (да, забыл сказать - таких сгенеренных таблиц у меня несколько - но вот эта с квадратами - самая большая).


 
Jeer ©   (2012-01-02 22:32) [20]


> Alex_C   (01.01.12 23:03) [19]


К врачу не пробовал обратиться ?
У тебя явно прогрессирующая степень шизофрении.

Неумение свести множество полу-связанных ситуаций в одно логическое русло с ограниченными вариантами исхода - явный признак вышеозначенного.


 
Alex_C   (2012-01-03 11:48) [21]


> У тебя явно прогрессирующая степень шизофрении.


Позавчера Задорнова смотрел - там у него про троллинг в сетях было - ну точно про тебя :)


 
sniknik ©   (2012-01-03 12:09) [22]

генерация всех возможных вариантов, для использования возможно десятки нужных... да это почище выборки всех данных чтобы отфильтровать на клиенте (очень глупо и очень распространено, с "оправданием" - sql не знаю).

расчетные значения должны рассчитываться "на месте". и только для нужных/выбранных значений а не для всех 32 тыщ.

ты бы действительно логику продумал...


 
RWolf ©   (2012-01-03 13:51) [23]

определись, на какие вопросы юзера должен отвечать твой софт.
если среди них нет вопроса «дай мне список любителей, окучивших квадраты AB12, CD34 и EF56», то таблица вариантов тут даром не нужна.


 
Alex_C   (2012-01-04 12:07) [24]


> ты бы действительно логику продумал...


Ну так я тут и советуюсь - форум для этого и существует! :)


> «дай мне список любителей, окучивших квадраты AB12, CD34
> и EF56»


В том то и дело - что нужна! Это для УКВ - и у них там есть куча разных дипломов, основанных именно на разные сочетания сработанных этих квадратов.
По этому думаю вот как: в плане квадратов (их там более 32 тыс) таблицу заранее сгенерить. Потому как без sql делать нужную выборку практически не реально.
А вот для других аналогичных дипломных программ, где квадратов не более 100 - начальный список генерить. Хранить смысла особого нет - все и так практически моментально делается.


 
sniknik ©   (2012-01-04 12:32) [25]

> Ну так я тут и советуюсь - форум для этого и существует! :)
ты не советуешься, ты задаешь бессмысленно глупые вопросы...
глупые потому, что причин, логики твоей никто не знает, и ты не говоришь, почему хочешь именно так, а "совета" спрашиваешь по конечному, придуманному тобой, и выглядящему бредово... фактически только подтверждения ждешь, типа "да нужно именно так".
бессмысленно потому, что даже где понято, и что-то присоветовано, не следуешь... непонятое игнорируешь? и говоришь что учишься. ага.

вот что непонятного в том что расчетные данные нужны только для уже выбранного (маленького количества), и потому расчеты будут быстрыми в любом случае.
???
так нельзя сделать? не вкладывается в твои реалии. ну тогда где объяснение почему тебе это не подходит (почему нельзя использовать "совет")?


 
RWolf ©   (2012-01-04 13:20) [26]


> как более правильно - 1 раз сгенерить, и потом уже использовать
> готовую таблицу (так конечно быстрее, но и объем справочной
> таблицы увеличиться), или генерить?

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


 
Sha ©   (2012-01-04 19:06) [27]

> Alex_C

А чем тебе двумерный битовый массив не угодил?
На одного радиста всего-то 4к памяти надо.


 
Jeer ©   (2012-01-04 21:12) [28]


> А чем тебе двумерный битовый массив не угодил?


Человек копает землянку детской лопаточкой, бесполезно советовать ему как строить небоскреб.


 
Alex_C   (2012-01-06 00:12) [29]


>  бесполезно советовать ему как строить небоскреб.


Небоскреб уже построен - и обогнал он уже по высоте многие рядом стоящие. На самом деле остался только один. Его и пытаюсь обогнать.
На счет грубости и пошлости - привык уже - все же с 98 года программа. К сожалению для программеров это в порядке вещей.

В общем спасибо форуму - очень мне помог!

А теперь на прощанье маленькая притча - реальная история. Ее мне мой преподаватель математики рассказал: (сейчас уже подробностей не помню, но ее думаю многие знают): пришел как то к одному известному математику молодой юноша - богатый, влюбленный в математику, но ... но не гений. И сказал юноша: хочу прославиться в истории. Математик подумал.. ну что ему сказать.. послать? Но юноша посулил много денег на университет, в котором математик преподавал. И математик сказал - сделай таблицу простых чисел от 1 до 1000000 (а дело было в 18 веке - только руками считать.) И посчитал математик, что избавился он от юноши навсегда. Но через 20(???) лет пришел к нему тот мужчина(бывший юноша) и сказал - я сделал то, что ты мне велел. И оказалась что на многие десятилетия его таблица простых чисел вошла в историю. И его имя знает каждый уважающий себя математик)))
Так что так: чтоб войти в историю кроме ума, еще и трудолюбие нужно. А оно у меня есть)))
Удачи всем))))


 
Jeer ©   (2012-01-06 14:20) [30]


>... еще и трудолюбие нужно. А оно у меня есть)))


Так никто не против Вашего трудолюбия и занятия - это Ваше дело.

Вы же не в первый раз появляетесь здесь на форуме и с весьма дилетантскими вопросами.
Апелляция Ваша, к более чем 10-летнему сроку исполнения программы - лишнее тому подтверждение.

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

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

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

Вы обращаетесь за помощью и советами на форум, где присутствуют профессионалы и сетуете на "хамство" с их стороны.
Это не хамство, а жесткая позиция, что никто тут не будет участвовать вместе с Вами в постройке Ваших "велосипедов", а призывает Вас перейти в русло профессиональных обсуждений.

Но Вы к этому не готовы, это очевидно.

Кстати, задача обслуживания QSL-карточек и радиолюбительских дипломов решается программистом-профессионалом, при условии наличия адекватного ТЗ, не более чем за месяц.

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

Что же касается притч и афоризмов, мне больше по душе:
"Знание некоторых принципов избавляет от необходимости знания многих фактов".

Удачи и с Рождеством !


 
Sha ©   (2012-01-06 15:03) [31]

> Alex_C

Кто не слушает других обычно считает, что не слушают его.
Успехов!


 
MsGuns ©   (2012-01-06 16:31) [32]

"Ну вот, еще один уходит от нас с ожесточенным сердцем"

(почти Шарапов)


 
Alex_C   (2012-01-06 20:02) [33]


> Вы же не в первый раз появляетесь здесь на форуме и с весьма
> дилетантскими вопросами.


Может у меня не правильное восприятие форума. Понимаете - действительно - очень много грубости , причем не обоснованной именно на програмерских форумах.
Я допустим общаюсь на форуме пользователей автомобилей Nissan - там вообще все очень доброжелательно. Да - у людей и так в жизни все хорошо, вот и советуют от души - никто не злится.
На счет делитанства - если не поленитесь и проанализируете мою программу (RX4HX) мысли об этом пройдут сразу))) Поверьте)))
Я просто хочу ВЫТЯНУТЬ народ на ДИАЛОГ. Не МОНОЛОГ, а ДИАЛОГ. Не уверен, что мне это получается(((


> Вы игнорируете советы


Опять же простое непонимание. Вы даже представить себе не можете, как данный форум (не по БД - а вообще) продвинул мою программу.
Пользователь Сергей М. рассказал мне (нет не рассказал - а заставил подумать!) как правильно сделать телнет - остальные проги так и не смогли этого сделать)))
Я и не прошу готовых решений - я хочу ДИСКУССИИ! А не так - делай ТАК по тому что это верно. Слишком много раз убеждался в обратном.


> "Знание некоторых принципов избавляет от необходимости знания
> многих фактов".


Если бы все следовали этому принципу то и открытий не было в принципе.
Приведу пример из своей не столь уж давней молодости: в 90-е годы считалось что ГПД транзистора более 80% - практически не достижим. У современных транзисторов ГПД около 99,9%! А всего то прошло?)))


 
Sha ©   (2012-01-06 20:27) [34]

> Alex_C   (06.01.12 20:02) [33]

Видишь ли, в чем дело. Ты задаешь вопрос, а не направление дискуссии.

Прежде чем погрузиться в проблему, которую ты предлагаешь решать так, а не иначе,
хотелось бы узнать, почему тобой было отвергнуто простое и очевидное решение [27]?


 
sniknik ©   (2012-01-06 21:34) [35]

> почему тобой было отвергнуто простое и очевидное решение [27]?
он хочет не такого диалога. где он должен "отчитываться", и доказывать что выбранное им верно, а такого когда все вокруг наперебой варианты предлагают, код в доказательство "лучшести" пишут, а он так лениво, не не пойдет, отстой, ну это уже было...
ну типа того, такое сложилось впечатление.


 
Jeer ©   (2012-01-07 21:10) [36]


> (RX4HX)


Посмотрел, наворочено много, дизайн - отстой.
Таково же мнение части его "товарищей по болезни".

С другой стороны - "Если нет шансов на женщину, сойдет и резинка".


 
Inovet ©   (2012-01-08 11:58) [37]

> [8] Ega23 ©   (29.12.11 13:09)
> TForm30
...
> CDS.FieldDefs.Add("Caption", ftString, 30);
> 100000 записей - почти 3 секунды

Это магия. Так нечестно.


 
Ega23 ©   (2012-01-10 12:47) [38]


> Это магия. Так нечестно.


:))))))))



Страницы: 1 вся ветка

Текущий архив: 2012.05.13;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.007 c
2-1326450595
Nucer
2012-01-13 14:29
2012.05.13
PosEx и RawByteString


15-1325282449
Германн
2011-12-31 02:00
2012.05.13
Чем приклеить металл к мрамору?


2-1326358342
Артем
2012-01-12 12:52
2012.05.13
Загрузка 64 битной dll из 32 битной программы


3-1275551753
fox23
2010-06-03 11:55
2012.05.13
помогите


2-1325080645
Alex_C
2011-12-28 17:57
2012.05.13
ClientDataSet as memtable - тормозит при добавлении записей