Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.003 c
6-1255886164
irongvozd
2009-10-18 21:16
2012.05.13
подбор пароля


15-1325830703
kudatsky
2012-01-06 10:18
2012.05.13
SWF-файлы в Delphi


15-1325724554
Германн
2012-01-05 04:49
2012.05.13
Сколько на сей день существует действующих компиляторов


15-1325946053
Айболит
2012-01-07 18:20
2012.05.13
ноут


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский