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

Вниз

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

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

Наверх




Память: 0.5 MB
Время: 0.045 c
4-1094994967
шнур
2004-09-12 17:16
2004.10.17
shellexecute


1-1096830129
nof
2004-10-03 23:02
2004.10.17
Бинарные перестановки


3-1095420833
Ceval
2004-09-17 15:33
2004.10.17
как организовать фильтрацию по полям Character и Numeric


14-1096254807
Soft
2004-09-27 07:13
2004.10.17
Лохотрон форева: Антенный Усилитель


1-1096962576
gdima
2004-10-05 11:49
2004.10.17
FastReport userfunction





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