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

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

Работы с большими таблицами данных.


Страницы:   1 2

Фродо ) ©   (2006-01-09 00:59:00) 

Проблема такова - мне необходимо сделать так, чтобы программа записывала и отображала в списке очень большую таблицу (порядка 500.000 и более строк и около 4- 5 колонок).
Впросы такие :
1) Каким компонентом воспользоваться для реализации моей идеи? (пробовал юзать СтрингГрид, но ничего не вышло - слииииишком долго он загружает таблицу)
2) Как можно БЫСТРО загрузить такую таблицу, или как с ней лучше всего работать (чтобы был быстрый доступ к любой троке таблицы) ?

Спасибо.


palva   (2006-01-09 23:26:00) [1]

Сейчас поигрался немного. Работают клавиши Ctrl-B, Ctrl-I, Ctrl-U. Наверняка есть документация, где все это описано.


palva   (2006-01-09 23:17:00) [2]

Фродо )   (09.01.06 15:13) [17]
> Надо чтобы можно было изменить данные в любой из строк - ткнув на ней мышкой и введя новые данные. А при использовании браузера, грузя ХТМЛ таблицу - это проблематично
Ну как раз здесь проблем нет. У вас проблема другая - очень много строк.  Так что нижеследующий код вам вряд ли пригодится. Я уж сейчас не буду заботиться о скорости и напишу с динамическим заполнением таблицы всего на сто строк.

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
 d, t, r, c: OLEVariant;
begin
 WebBrowser1.Navigate
 ('about:<div contenteditable><table border=1 id=tbl>'+
 '<tr><td width=100>col1</td><td width=100>col2</td></tr>'+
 '</table></div>');
 repeat
   Application.ProcessMessages;
 until WebBrowser1.readyState = 4;
 d := WebBrowser1.Document;
 t := d.all.tbl;
 for i:=1 to 100 do begin
   r := t.insertRow;
   c := r.insertCell;
   c.innerHTML:= IntToStr(i);
   c := r.insertCell;
   c.innerText:=IntToStr(i div 2);
 end;
end;

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


аматор   (2006-01-09 21:51:00) [3]

Привет...
Фродо - может я туп (если Вы работаете с "дельфином"), но зачем для отображения (просто отображения) базы использовать стринггрид а не дбгрид, или там есть выборка с которой запросами не справиться...


Фродо )   (2006-01-09 21:03:00) [4]

>Формат хранения данных менять можно?

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


Fay   (2006-01-09 15:26:00) [5]

Формат хранения данных менять можно?


Фродо )   (2006-01-09 15:13:00) [6]


> Отображать порядка 500.000 строк, на первый взгляд, по крайней
> мере не разумно (если вспомнить о юзере). Возможно следовало
> бы воспользоваться запросами перед отображением?
>


Поравлюсь...  Мне надо сделать так чтобы пользователь МОГ просмотреть очень большую таблицу сам (поскольку когда я пользовался именно запросами на поиск определенной строки \ строк мне говорили - мол ХАЧУ ШТОБЫ ВЕСЬ СПИСОК ЗАГРУЖАЛСЯ И ЕГО МОЖНО БЫЛО ПРОЛИСТАТЬ САМАМУ), бред конечно, но хозяин как говорится - барин...

И еще видите ли в чем загвоздочка... Надо чтобы можно было изменить данные в любой из строк - ткнув на ней мышкой и введя новые данные.. А при использовании браузера, грузя ХТМЛ таблицу - это проблематично )...
Извиняюсь что не сказал это ранее, и приношу извинения за заранее не полностью обрисованую проблему.


> отрисовывает у меня браузер за 15 секунд (2.4 Ггц)


У меня СтрингГрид таблицу из 100.000 строк и 5 столбцов грузит за 6 секунд (P-IV  3.2)
примерно так..

procedure LoadCollection(SG:TStringGrid; FileName:pchar);
var
f:textfile;
temp,x,y,r:integer;
sapppath,tempstr:string;
begin
sapppath := ExtractFilePath(Application.ExeName);

  tempstr := '';

   sg.Cols[0].BeginUpdate;
   sg.Cols[1].BeginUpdate;
   sg.Cols[2].BeginUpdate;
   sg.Cols[3].BeginUpdate;
   sg.Cols[4].BeginUpdate;

if FileExists(FileName) then
 begin
     assignfile(f,FileName);
     reset(f);
     readln(f,temp);
     SG.colcount:=temp;
     readln(f,temp);
     SG.rowcount:=temp;

   For y:=0 to SG.colcount-1 do
   For x:=0 to SG.rowcount-1 do
    begin
      readln (F, tempstr);
      SG.cells[y,x]:=tempstr;
    end;

   sg.Cols[0].EndUpdate;
   sg.Cols[1].EndUpdate;
   sg.Cols[2].EndUpdate;
   sg.Cols[3].EndUpdate;
   sg.Cols[4].EndUpdate;
   end;
end;


Код старый и не мой, моим методом сохранения \ загрузки таблицы стринггрида она загружается 9 секунд.

А это очень долго...
Вот тот же FileMonitor грузит свой собственный лог (более 500.000 записаей) около 2-х секунд.  Вот мне и надо добиться примерно того же....


> А что из себя представляет сама таблица?


Таблица представляет из себя списки проданой продукции за месяц \ пол года \ год.

| Наименование товара |  Продано  |    Цена   |  
|                                |               |              |
|                                |               |              |

Вобщем такая вот таблица... А за месяц \ год представляете себе КАКАЯ получится эта таблица!!

Вот примерно такова ситуация...


Набережных С.   (2006-01-09 14:49:00) [7]

Я думаю, что DrawGrid + динамическая подгрузка данных позволят отрисовать несколько быстрее 15 секунд даже на более слабой машине :)


Fay   (2006-01-09 14:49:00) [8]

2 palva ©   (09.01.06 14:42) [14]
> Ну мне дальше не интересно
При некоторй доработке и Ваш способ можно сделать ещё медленее. Не опускайте руки!


palva   (2006-01-09 14:42:00) [9]

> Конечно, речь идёт о TDBGrid(Eh).
Ну мне дальше не интересно, я думал будет фотошоп.


Fay   (2006-01-09 14:40:00) [10]

2 palva ©   (09.01.06 14:34) [12]
Конечно, речь идёт о TDBGrid(Eh).


palva   (2006-01-09 14:34:00) [11]

> писать в TdxMemData
Писать можно и в массив. Автор хочет просматривать.


Fay   (2006-01-09 14:23:00) [12]

1 Фродо )
А что из себя представляет сама таблица?


Fay   (2006-01-09 14:10:00) [13]

2 palva ©   (09.01.06 13:29) [9]
15 секунд - это очень долго.
Если данные брать так же (for i ...) и писать в TdxMemData (к примеру), то будет 0.4 с (Celeron 2.4).
Те же данные из MSSSQL - 0.6 сек.

Какие 15?!


palva   (2006-01-09 13:29:00) [14]

> Использование браузера, в данном случае, сродни забиванию гвоздей микроскопом.
Не понимаю ваш намек. Браузер как раз и предназначен для просмотра данных. У меня подозрение что на больших объемах данных браузер будет работать немного быстрее чем DataGrid. Вот такая кнопка

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
 fo: TextFile;
begin
 AssignFile(fo, 'c:/tbl.htm');
 Rewrite(fo);
 WriteLn(fo, '<table border=1>');
 for i:=1 to 100000 do begin
   WriteLn(fo, '<tr><td>'+IntToStr(i)+'</td><td>'+
   IntToStr(i div 2)+'</td></tr>');
 end;
 WriteLn(fo, '</table>');
 CloseFile(fo);
 WebBrowser1.Navigate('file://c:/tbl.htm');
end;

отрисовывает у меня браузер за 15 секунд (2.4 Ггц)
Если вы считаете, что здесь уместнее использовать фотошоп, то - вперед, помогите автору, может он вам и денег отвалит. А я спорить не буду, я здесь не для споров и не для зарабатывания денег.


Fay   (2006-01-09 12:04:00) [15]

Я бы даже сказал "микроскопов гвоздём"


Fay   (2006-01-09 12:02:00) [16]

2 palva ©   (09.01.06 11:16) [5]
Опыта (боевого) нет, но я знаю, как это сделать.
Могу поспорить на некоторую сумму 8).

> То что вы пишете, очень интересно.
Использование браузера, в данном случае, сродни забиванию гвоздей микроскопом.
Согласитесь - тоже весьма занимательно.


TUser   (2006-01-09 11:25:00) [17]

DBGrid


palva   (2006-01-09 11:16:00) [18]

Fay ©   (09.01.06 10:45) [4]
> Ага, не хуже, чем Photoshop.
То что вы пишете, очень интересно.
Расскажите, как можно для просмотра таблиц приспособить фотошоп? Как поместить окно фотошопа на форму делфи? И что будет работать быстрее, браузер или фотошоп. Поделитесь пожалуйста опытом.


Fay   (2006-01-09 10:45:00) [19]

2 palva ©   (09.01.06 1:22) [1]
> Он должен с этим хорошо справиться
Ага, не хуже, чем Photoshop.


Alarm   (2006-01-09 10:18:00) [20]

Отображать порядка 500.000 строк, на первый взгляд, по крайней мере не разумно (если вспомнить о юзере). Возможно следовало бы воспользоваться запросами перед отображением?


Страницы:   1 2

Наверх

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