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

Вниз

Вопрос о временный таблицах   Найти похожие ветки 

 
Officeman   (2006-05-16 00:52) [0]

Уважаемые господа!
Нужно быстро создавать (временную) табличку на 10"000 столбцов.

В начале проекта использовал TListView и генерировал таблички от 100 до 1000 столбцов этого вполне хватало. но с увеличением числа столбцов до 10"000. Обработка добавления столбцов сильно тормозила, время на обработку до 10 часов. ))))).
Конечно это не выход! )  Что можете посоветовать?

Требования:
1) Хранение всей таблицы в памяти(получение значения из любой ячейки, по аналогии использования TListView)
2) Возможность организации цикла по табличке.

Интересуют все возможные(известные) методы в ДЕлфи

с Уважением, Officeman


 
Джо ©   (2006-05-16 00:59) [1]

array.


 
Palladin ©   (2006-05-16 09:15) [2]

или TList
+ работа TListView в виртуальном режиме


 
Jeer ©   (2006-05-16 09:26) [3]

Officeman   (16.05.06 00:52)

Или один из вариантов СУБД с поддержкой "Table in memory"


 
Сергей М. ©   (2006-05-16 09:47) [4]

Какое макс. кол-во записей планируется хранить в такой таблице ?


 
Officeman   (2006-05-16 10:02) [5]

2Сергей М., записей порядка 200, не больше.
коооличество столбцов 10"000, возможно нужно будет больше.

p.s.
вчера формировал табличку на 10"000, используя мощный ПК, формировалось 5 часов. немыслемо долго.

2Palladin
"или TList + работа TListView в виртуальном режиме"
хм. TList попробую сегодня.


 
Сергей М. ©   (2006-05-16 10:12) [6]

Данные какого типа должны храниться в таблице ?


 
Jeer ©   (2006-05-16 12:30) [7]

Officeman   (16.05.06 10:02) [5]

А верна ли постановка задачи ?

> вчера формировал табличку на 10"000, используя мощный ПК,
>  формировалось 5 часов. немыслемо долго.


 
Desdechado ©   (2006-05-16 12:49) [8]

> записей порядка 200, не больше.
> столбцов 10"000, возможно нужно будет больше.
а не приходило в голову повернуть таблицу на 90 градусов?
тогда столбцов не более 200, а строк - сколько втиснешь


 
TUser ©   (2006-05-16 14:31) [9]

Верно ли, что таблица должна быть на экране, или достаточно двухмерного массива в памяти? Есть подозрение, что тормоза возникают из-за прорисовки.


 
Jeer ©   (2006-05-16 16:33) [10]


> таблица должна быть на экране


Очень плохо представляю на экране таблицу с 10 тыс строк или столбцов.


 
TUser ©   (2006-05-16 16:44) [11]


> Очень плохо представляю на экране таблицу с 10 тыс строк
> или столбцов.

Бегунок справа/снизу.


 
Jeer ©   (2006-05-16 17:14) [12]

TUser ©   (16.05.06 16:44) [11]

Все равно не получается:))

Через пару сотен записей забываю предыдущие.


 
Palladin ©   (2006-05-16 17:14) [13]

:) мда... тут что то не так... столбцов так 20 - это уже расстройство желудка... но 10 тыс.... это по настоящему страшно... попробовал ради интереса хотя бы тысячу добавить в TListView, просто, без данных Columns.Add... на celeron 2.8 с LockWindowUpdate 2.7 минуты...


 
Officeman   (2006-05-17 08:54) [14]

Приветствую всех вас!
Спасибо за поддержку топа!

1) табличку выводить на экран не надо.
2) данные integer.
3) развернуть табличку можно но придётся в корне менять движок, много времени займёт.

p.s. как я уже понял TListView не вариант для 10"000 столбиков ))).  
пробовал TListItem, не понял как организовать цикл добавления столбцов(


 
Сергей М. ©   (2006-05-17 09:00) [15]


> Officeman   (17.05.06 08:54) [14]


п.1 в сочетании с п.2 однозначно говорят об изначально неверном выборе TListView в кач-ве контрола, эффективно решающего задачу


 
evvcom ©   (2006-05-17 09:41) [16]

Может лучше задачу озвучишь, чем спрашивать о быстроте создания 10000 столбцов?


 
Officeman   (2006-05-17 10:24) [17]

Окей!

Задача: принажатии на кнопочку, создать табличку заданного размера
X x Y(число столбцов на число позиций), с последующей возможностью работы с ячейками этой таблицы., аналогично TListView. Пример действий: из таблицы получить данные всей строки, столбца или данные конкретной ячейки(x,y). т.е. организация цикла по табличке.

данные типа integer, заносятся в табличку в момент её создания.


 
ЮЮ ©   (2006-05-17 10:36) [18]

с последующей возможностью работы с ячейками этой таблицы., аналогично TListView

И какие это возможности, кроме редактироования первого столбца?

a: Array of Array of <нужный тип>
SetLength(a, <число строк>, <число столбцов>

Визуализация:
1) TListView  в виртуальном режиме (OwnerData = true)
2) TDrawGrid - получишь доступ к каждой ячейке, а не строке целиком


 
Сергей М. ©   (2006-05-17 10:36) [19]


> Officeman   (17.05.06 10:24) [17]


И чем использование обычного двумерного массива тебе не угодило ?

Куда уж проще и быстрей - объявил такой массив, создал-заполнил его и шаришься по нему как твоей душе угодно ..


 
Officeman   (2006-05-17 11:09) [20]

to ЮЮ,  только заполнение в процессе создания. во время последующего использования - только читать данные.

//TListView  в виртуальном режиме (OwnerData = true)
попробую. хотя никогда не использовал. будут вопросы - спрошу.

to Сергей М.
сложность в послед.обработке данных.

спасибо.


 
Сергей М. ©   (2006-05-17 11:23) [21]


> Officeman   (17.05.06 11:09) [20]


> сложность в послед.обработке данных


В чем же она состоит ?
Проиллюстрируй ..


 
Officeman   (2006-05-17 11:47) [22]

при каждом нажатии кнопки обрабатывается следующая строка таблицы,
с циклом по всем столбикам. (с определённым условием)

Каждый столбик имеет свой порядковый номер записанный в Caption. указав номер столбца - можно получить все его значения (в столбик).

т.е. нужна возможность организованного цикла по строкам или столбцам таблички.


 
Сергей М. ©   (2006-05-17 11:55) [23]


> порядковый номер записанный в Caption


Зачем что-то записывать в Caption, если по условию


> 1) табличку выводить на экран не надо


?

Зачем вообще хранить целое число в строковом представлении, если для этого существует Integer-тип ?


> указав номер столбца - можно получить все его значения


Ну так в случае с массивом все это как раз замечательно решается !
В чем проблема-то ?


 
MetalFan ©   (2006-05-17 12:08) [24]

народ, мастера, вы что, прикалываетесь?!
зачем визуальные компоненты использовать в невидимом режиме для хранения данных?!
чем вам динамические массивы не подходят?
или какой-нить TMemoryTable из RX или JVCL


 
Jeer ©   (2006-05-17 12:08) [25]


> В чем проблема-то ?


Вероятно, от незнания основ программирования и элементарных структур данных.


 
Сергей М. ©   (2006-05-17 12:14) [26]

const

 MaxRows = 200;
 MaxCols = 10000;

type

 PTempTable = ^TTempTable
 TTempTable = array[0..MaxRows-1, 0..MaxCols-1] of Integer;
 PTempRow = ^TTempRow;
 TTempRow = array[0..MaxCols-1] of Integer;
 PTempCol = ^TTempCol;
 TTempCol = array[0..MaxRows-1] of Integer;

var
 TempTable: PTempTable;
 TempRow: PTempRow;
 TempCol: PTempCol;
 Rows: Integer = MaxRows;
 lCols: Integer = MaxCols;
 Row, Col: Integer;
 i: Integer;
..
 
 i := 0;
//создаем таблицу
 GetMem(TempTable, Rows * Cols * SizeOf(Integer));
 try
//инициализируем таблицу
    for Row := 0 to Rows - 1 do
      for Col := 0 to Cols - 1 do begin
        TempTable[Row, Col] := i;
        Inc(i);
      end;

//получаем содержимое 3-го столбца
 GetMem(TempCol, Rows * SizeOf(Integer));
 try
   Col := 3;
   for Row := 0 to Rows - 1 do
     TempCol[Row] := TempTable[Row, Col];
   ....
 finally
   FreeMem(TempCol);
 end;

//получаем содержимое 5-й строки
 GetMem(TempRow, Cols * SizeOf(Integer));
 try
   Row := 5;
   for Col := 0 to Cols - 1 do
     TempRow[Col] := TempTable[Row, Col];
   ....
 finally
   FreeMem(TempRow);
 end;

 finally
//уничтожаем таблицу
   FreeMem(TempTable);
 end;


 
Officeman   (2006-05-17 13:52) [27]

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

p.s.
я больше математик, нежели программист.
спасибо за инстуктаж. примеры ооочень пригодятся


 
Сергей М. ©   (2006-05-17 14:04) [28]


> На первых стадиях проекта, нужно было видеть все данные.


Их и сейчас, при использовании массива, можно "увидеть", причем без особых потуг.

см. TListView.OwnerData = True - включение вирт.режима работы TListView, при котором собственно данные могут храниться где угодно (в т.ч. в массиве), а TListView лишь визуализирует эти данные.


 
Officeman   (2006-05-17 15:58) [29]

т.е. ты хочешь сказать что можно также использовать TListView но переключив его в виртуальный режим? тогда вопрос: код добавления столбцов и строк, надо менять? щас буду мучать OwnerData )


 
Сергей М. ©   (2006-05-17 16:02) [30]


> код добавления столбцов и строк, надо менять?


Его, этого кода, вообще не будет в вирт.режиме.


 
TStas ©   (2006-05-17 19:18) [31]

А чем плохо хранить данные в динамическом массиве, а показывать можно и в TStringGrid. Рядом положить на форму TScrollBar по его прокрутке показывать очередную порцию данных. При этом память почем зря не расходуется, т. к. нет лишних объектов с кучей свойств. Ну как бы рамка перемещается по массиву.


 
Джо ©   (2006-05-17 19:23) [32]

> А чем плохо хранить данные в динамическом массиве

Да ничем не плохо. Вроде, тут каждый второй пост именно об этом.


 
Officeman   (2006-05-18 07:41) [33]

2Сергей М.  посоветуй источник информации по этому вопросу [30]
p.s.
) когда включаю режим  OwnerData=true,  процесс создания таблы, заметно увеличивается. каким макаром потом устроить цикл по табличке?

спасибо.


 
Officeman   (2006-05-18 08:03) [34]

а если использовать всё таки массив данных. на примере описанном в посте [26]
каким образом правильно выделить память. попробовал текущий код. до удачного завершения обработки - система "вешается",  w2000 например. после завершения операции - ос отпадает и нормально пашет.


 
Сергей М. ©   (2006-05-18 08:11) [35]


> Officeman   (18.05.06 07:41) [33]


см. стандартную справку и демо-проект

(%Delphi7%)\Demos\Virtual Listview


> включаю режим  OwnerData=true,  процесс создания таблы,
> заметно увеличивается


Создание таблицы в массиве не имеет отношения к ListView - последний лишь отображает содержимое заранее подготовленной таблицы.


> каким макаром потом устроить цикл по табличке?


Ты в [26] пример разобрал ? Там как раз и фигурирует "цикл по табличке" (см. комментарий //создаем таблицу)


 
Jeer ©   (2006-05-18 11:04) [36]


> Officeman   (18.05.06 08:03) [34]


Совершенно непонятно почему Вас не устраивает просто:

const
ColMax = 200;
RowMax = 200;

var
arTable: array of array of integer;

// Выделение памяти
SetLength(arTable,  RowMax, ColMax);

// Обращение к элементу
arTable[i,j];

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


 
Сергей М. ©   (2006-05-18 11:10) [37]


> Officeman   (18.05.06 08:03) [34]
> каким образом правильно выделить память.


А в примере разве не правильно ?
Какие сомнения у тебя возникли по этому поводу ?


> попробовал текущий
> код. до удачного завершения обработки - система "вешается",
>   w2000 например. после завершения операции - ос отпадает
> и нормально пашет.


Что есть "система "вешается" ? Форма не реагирует на клаву/мышь  что ли ?


 
Officeman   (2006-05-18 11:47) [38]

Спасибо за подробные ответы. Очень признателен.

>to Jeer
>const
>ColMax = 200;
>RowMax = 200;


да. опыта мне нехватает. (
НУжно сделать так чтобы пользователь сам выбирал
размеры таблицы используя  Edit1, Edit2
перед её созданием., а тут жёстко задаётсяконстантами.
подскажите как правильно это сделать. спасибо.

>А в примере разве не правильно ?
>Какие сомнения у тебя возникли по этому поводу ?


нужно создать более одной таблицы. и держать их в памяти.
с возможностью работы с ними(получение данных).
во время работы программы.
Одна табличка на 10"000 стоблцов  x 200 строк
Вторая и Третья таблички, по 10"000 столбцов на 4 строки.

>Что есть "система "вешается" ? Форма не реагирует на клаву/мышь  что ли ?

не только форма. но и ОС тоже. сильно тормозит на секунд 10. потом отвисает и через некоторые время снова повторяется завис. - всё это происходит во время работы  обработки.   ОЗУ 512.   да вобщем это неглавное.


 
Сергей М. ©   (2006-05-18 12:00) [39]


> Officeman   (18.05.06 11:47) [38]


Почему же константами ?
Переменными !

Rows: Integer = MaxRows; //по умолчанию - максимально возможное число строк
Cols: Integer = MaxCols; //по умолчанию - максимально возможное число столбцов

Перед тем как создавать таблицу ты волен изменить значения переменных Rows и Cols, взяв их из тех самых Edit"ов


> нужно создать более одной таблицы. и держать их в памяти


В чем же проблема ?


 
Сергей М. ©   (2006-05-18 12:04) [40]


> всё это происходит во время работы  обработки


Что подразумевается под "обработкой" ?
Иллюстрируй в коде ..



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

Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.013 c
3-1146574237
ZABor
2006-05-02 16:50
2006.06.25
Грид.столбец = таблица.столбец и таблица.столбец1


15-1148986185
Dzhin
2006-05-30 14:49
2006.06.25
Йога


3-1146207610
Некто
2006-04-28 11:00
2006.06.25
X*Y*H


2-1149502986
новик
2006-06-05 14:23
2006.06.25
преобрпзование типов int64 в int


2-1149314370
Тимофеич
2006-06-03 09:59
2006.06.25
pos or posex





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский