Форум: "Основная";
Текущий архив: 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.04 c