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

Вниз

Огромный массив объектов   Найти похожие ветки 

 
ancot   (2004-09-28 00:13) [0]

Доброй ночи всем. Есть такая проблема, реализовать в памяти двумерный масив объектов (для Grid) 256 X 65536, пробовал массив указателей, но при установке значения каждого элемента в nil
это все кушает 17 Mb (т.к. указатель = 4 byte). Может есть более ресурсоёмкий способ ?.


 
Anatoly Podgoretsky ©   (2004-09-28 00:20) [1]

А должно быть более 64иб, так что у тебя где то ошибка.


 
Palladin ©   (2004-09-28 00:23) [2]

это мелочи по сравнению с тем сколько будут жрать все созданные объекты.

>  Может есть более ресурсоёмкий способ ?.

конечно есть, но только в том случае если объектов у тебя будет отнюдь не 256*65536... создать запись-оболочку для элемента

TElement=Record
X,Y:Integer;
Data:TObject;
End;

и использовать обычный TList...
или же реализовать свой контейнер для данных со свойством Element[X,Y]:TObject;

PS: Эксель пишешь чтоли? :)


 
dmk ©   (2004-09-28 00:23) [3]

>Может есть более ресурсоёмкий способ ?.
Можно использовать 8 байт вместо 4 =)


 
ancot   (2004-09-28 00:26) [4]

> А должно быть более 64иб, так что у тебя где то ошибка.

пример:

procedure TForm2.Button4Click(Sender: TObject);
type
 PRow = ^TRow;
 TRow = array[0..65535] of TbrCell; // Столбец ячеек
 PCol = ^TCol;
 TCol = array[0..255] of PRow; // Массив столбцов ячеек
 PCell = ^TCell;
 TCell = array[0..16777215] of PCol; // Массив ячеек

var Mat: PCol;
   X, Y, Z, Xmax, Ymax: Integer;
   p: Pointer;
begin
 Xmax := 256;
 Ymax := 65536;
 GetMem(Mat, Xmax * SizeOf(PRow)); // Выделение памяти под
 for X := 0 to Xmax - 1 do
 begin
   GetMem(Mat[X], Ymax * SizeOf(TbrCell));
   // Вот это место все портит
   for Y := 0 to Ymax - 1 do  Mat^[X]^[Y] := nil;
 end;

 // Освобождаем
 for X := 0 to Xmax - 1 do
   FreeMem(Mat[X], Ymax * SizeOf(TbrCell));
 FreeMem(Mat, Xmax * SizeOf(PRow));
end;


 
Palladin ©   (2004-09-28 00:26) [5]

"Может есть более ресурсоёмкий способ ?."

блин из разряда "видим ожидаемое"...


 
GuAV ©   (2004-09-28 00:31) [6]


>  256 X 65536

статический был бы array[0..255,0..65535] of ,  динамический array of array of . а здесь имхо не массив.

>Может есть более ресурсоёмкий способ ?

нет предела совершенству.


 
Ломброзо ©   (2004-09-28 00:39) [7]

В TList поиск линейный, а в гриде, как правило, критична скорость чтения (при отрисовке грида) элементов "разреженного массива", а не вставки. Поэтому выхода два (даже три):
1) Найти реализацию Hashtable или Map для Delphi и двумерный массив представлять как хэш хэшей (идиома, знакомая программистам perl)
2) то же самое, только ключом хэша будет Point, значением - строка
3) не изобретать лисапет, а содрать реализацию из модуля Grids.pas


 
ancot   (2004-09-28 00:43) [8]

> не изобретать лисапет, а содрать реализацию из модуля Grids.pas

так и знал что к этому и придем. Спасибо всем.


 
Palladin ©   (2004-09-28 00:47) [9]


> [7] Ломброзо ©   (28.09.04 00:39)

сортировка чисел Int64 решит проблему скорости...


 
Palladin ©   (2004-09-28 00:48) [10]

я бы даже сказал просто Integer... максимальное быстродействие...


 
ancot   (2004-09-28 00:49) [11]


> сортировка чисел Int64 решит проблему скорости...

сортировка в TList ?


 
Palladin ©   (2004-09-28 00:54) [12]

во первых кроме TList существует еще и array of
во вторых для представления координат хватит и integer
IntRec.hi:=x
IntRec.lo:=y

бинарный поиск

в третьих это не прокатит если объектов существует около 30% от максимального количества... тогда можно смело забить на проблему с памятью у массива... эти 30% будут занимать на порядок больше...


 
Defunct ©   (2004-09-28 01:26) [13]

Palladin ©   (28.09.04 00:54) [12]
> в третьих это не прокатит если объектов существует около 30% от максимального количества... тогда можно смело забить на проблему с памятью у массива... эти 30% будут занимать на порядок больше...

IMHO это даже в случае когда существует только 5% (~миллион объектов по ~1 кб на каждый объект уже Гиг)


 
Суслиу   (2004-09-28 11:52) [14]


>  [2] Palladin ©   (28.09.04 00:23)
> PS: Эксель пишешь чтоли? :)

Excel не держит все в памяти. Начиная с 97 он использутет structured storage. B случае редактирования Excel все держит и правит в этом файле. Где он держит новый документ я не знаю, но полагаю, что во временном структурном хранилище.

Причем протокол хранения там просто жутко заоптимизирован. Фактически применены методы слабенькой архивации. В основном это кассается замены повторяющихся блоков одим блоком с указанием количества посторений. И т.д.

ЗЫ. Говорю про формат biff8.


 
PVOzerski ©   (2004-09-28 14:08) [15]

А что, если c CreateFileMapping поиграть?


 
Palladin ©   (2004-09-28 21:31) [16]


> Excel не держит все в памяти.

Я разве это говорил? Причем здесь рассказ про эксель?


 
KSergey ©   (2004-09-29 06:12) [17]

А, эта... какой-нибудь MemDataSet - не решит проблему?


 
ancot   (2004-09-30 22:11) [18]


> Суслиу   (28.09.04 11:52) [14]


> Фактически применены методы слабенькой архивации. В основном
> это кассается замены повторяющихся блоков одим блоком с
> указанием количества посторений


На днях мне пришла мысль, зачем сохранять в файл каждую ячейку Grid когда можно сравнить предыдущую и текущую ячейки, и не писать их в файл по отдельности, а писать их количество и данные только одной повторяющейся ячейки.  А еще полистав XLGrid я увидел что незачем сохранять в файл все свойства ячейки, а только измененные (не хилая экономия пространства на диске).
Но это все касательно хранения в файле.


> B случае редактирования Excel все держит и правит в этом
> файле.


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


 
ancot   (2004-09-30 22:29) [19]

Ксати, написал на Excel макрос, который заполняет ячейки 256 х 65536 текстом "ффффф", в следствие чего система вешается, сжирая за ~ 200 Mb  RAM (окончания обработки я так и не дождался). Так если Microsoft не может, может и мне не стоит пытаться.


 
Суслик ©   (2004-10-01 09:52) [20]


>  [19] ancot   (30.09.04 22:29)
> Ксати, написал на Excel макрос, который заполняет ячейки
> 256 х 65536 текстом "ффффф", в следствие чего система вешается,
> сжирая за ~ 200 Mb  RAM (окончания обработки я так и не
> дождался). Так если Microsoft не может, может и мне не стоит
> пытаться.

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


>  [16] Palladin ©   (28.09.04 21:31)
> Я разве это говорил? Причем здесь рассказ про эксель?

Конечно, конечно - не говорил. Извини.
РАссказ преследовал две цели:
1. Поделиться впечатлениями от excel
2. Рассказать, что есть примеры использования структурного хранилища на диске в качестве оперативной памяти. Может автору будет интересно.



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

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

Наверх




Память: 0.52 MB
Время: 0.041 c
1-1096366408
JamesBond
2004-09-28 14:13
2004.10.17
Проблема с MDI в DLL


1-1095883102
Homa_Programer
2004-09-22 23:58
2004.10.17
delphi и Word


1-1096533182
Erik1
2004-09-30 12:33
2004.10.17
Как убрать фокус с контрола и перевести на форму?


14-1096447111
PVOzerski
2004-09-29 12:38
2004.10.17
А где бы найти ssh-клиента для Win32?


6-1091955903
Тихан Петрович
2004-08-08 13:05
2004.10.17
CreateThread and winSock