Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26158
Рейтинг: 2127
#211: 2012-04-09 12:29:45 ЛС | профиль | цитата
hitman249 писал(а):
под заголовком что имеется ввиду ?

То, где хранится основная информация кластера, для начала -- размер заголовка, номер кластера и адрес следующего кластера.

hitman249 писал(а):
зачем он тогда вообще нужен такой размер таблицы? исходя из этого получается от чего бежали к тому и вернулись.

Почему-то, это не остановило MS при создании NTFS. Ты про MFT слышал, так вот она, как раз, фиксированной длины, если ее не хватает, до добавляется следующий табличный кластер
------------ Дoбавленo в 12.23:
В чем проблема выделить блок памяти размером -- Размер Заголовка + Размер Кластера массива. В пределах одного кластера память уже выделяться не будет, пока не будет попытки выйти, при доступе к массиву, за пределы кластера (я так думаю -- на запись), после чего создается следующий блок массива.
------------ Дoбавленo в 12.29:
hitman249 писал(а):
чтото я с этими "--" начинаю не понимать их смысла

Это -- тире, состоящее из двух дефисов, а не минус. К отому же, это чисто моя фишка на форуме, по нему можно определить, что это писал именно я
карма: 22

0
Ответов: 5446
Рейтинг: 323
#212: 2012-04-09 20:01:34 ЛС | профиль | цитата
[offtop]
nesco, такое ощущение, что ты частенько (La)TeX-ом пользуешься -- оттуда и привычка "--" набирать.
[/offtop]
карма: 1

0
Разработчик
Ответов: 26158
Рейтинг: 2127
#213: 2012-04-10 14:04:11 ЛС | профиль | цитата
[offtop]
iarspider писал(а):
ты частенько (La)TeX-ом пользуешься -- оттуда и привычка "--" набирать

Это из Ворда пошло, там есть автозамена двух дефисов на одно тире[/offtop]
------------ Дoбавленo в 14.04:
Вот. Попробовал накоропать табличный (не цепочный) кластерный массив на IC. По тестам немного уступает динамическому массиву такого же типа. Но это чисто отработка алгоритма


Add(MainForm,2953706,98,126)
{
}
Add(InlineCode,6775550,308,126)
{
@Hint=#12:ClasterArray|
WorkPoints=#7:doItems|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|5:const|24: ArrClasterSize = 1024;|0:|5:type |22: PInteger = ^Integer;|21: ArrType = integer;|26: PClastArr = ^TClastArr; |63: TClastArr = packed array[0..ArrClasterSize - 1] of ArrType; |0:|4:type|25: TClasterArray = class; |32: PClasterArray = TClasterArray;|31: TClasterArray = class(TDebug)|24: FListPoint: PList;|30: FLength, FHigh: integer;|11: private|44: function GetEx(Idx: Integer): ArrType;|62: procedure PutEx(Idx: Integer; const Value: ArrType); |42: procedure SetLength(Value: integer);|22: procedure Clear;|10: public|35: destructor Destroy; override;|5: |67: property Items[Idx: Integer]: ArrType read GetEx write PutEx;|60: property Length: integer read FLength write SetLength;|40: property High: integer read FHigh;|4:end;|0:|40:function NewClasterArray: PClasterArray;|0:|80://******************************************************************************|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|31: ClasterArr: PClasterArray;|9: public|25: onResult: THI_Event;|24: constructor Create;|34: destructor Destroy; override;|51: procedure doItems(var Data:TData; Index:word);|5: end;|0:|14:implementation|0:|40:function NewClasterArray: PClasterArray;|5:begin|33: Result := PClasterArray.Create;|31: Result.FListPoint := NewList;|22: Result.FLength := 0;|4:end;|0:|33:destructor TClasterArray.Destroy;|3:var|13: i: integer;|5:begin|39: for i := 0 to FListPoint.Count - 1 do|44: dispose(PClastArr(FListPoint.Items[i]));|20: FListPoint.free; |12: inherited;|4:end;|0:|52:function TClasterArray.GetEx(Idx: Integer): ArrType;|3:var|23: block, elem: integer;|5:begin|15: Result := -1;|33: if Idx > FLength - 1 then exit;|34: block := Idx div ArrClasterSize;|34: elem := Idx mod ArrClasterSize; |53: Result := PClastArr(FListPoint.Items[block])[elem];|4:end;|0:|66:procedure TClasterArray.PutEx(Idx: Integer; const Value: ArrType);|3:var|23: block, elem: integer;|5:begin|33: if Idx > FLength - 1 then exit;|34: block := Idx div ArrClasterSize;|34: elem := Idx mod ArrClasterSize; |52: PClastArr(FListPoint.Items[block])[elem] := Value;|4:end;|0:|30:procedure TClasterArray.Clear;|3:var|13: i: integer;|5:begin|39: for i := 0 to FListPoint.Count - 1 do|44: dispose(PClastArr(FListPoint.Items[i]));|21: FListPoint.Clear; |4:end;|0:|34:procedure TClasterArray.SetLength;|3:var|18: CArr: PClastArr;|20: i, block: integer;|5:begin|19: if Value = 0 then|9: Clear|8: else |7: begin|38: block := Value div ArrClasterSize;|40: if block < FListPoint.Count - 1 then|9: begin|51: for i := block + 1 to FListPoint.Count - 1 do|48: dispose(PClastArr(FListPoint.Items[i]));|66: FListPoint.DeleteRange(block + 1, FListPoint.Count - block);|7: end|45: else if block > FListPoint.Count - 1 then|47: for i := 0 to block - FListPoint.Count do|11: begin|18: new(CArr);|44: FillChar(CArr^, ArrClasterSize, #0);|38: FListPoint.Add(Pointer(CArr));|14: end; |6: end;|19: FLength := Value;|23: FHigh := Value - 1; |4:end;|0:|80://******************************************************************************|0:|31:constructor THiAsmClass.Create;|5:begin|12: inherited;|34: ClasterArr := NewClasterArray; |4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|18: ClasterArr.free;|12: inherited;|6:end; |0:|30:procedure THiAsmClass.doItems;|3:var|16: i, j: integer;|5:begin|24: for i := 0 to 2099 do |7: begin|27: ClasterArr.Length := i;|36: for j := 0 to ClasterArr.High do|31: ClasterArr.Items[j] := j;|36: for j := 0 to ClasterArr.High do|49: _hi_onEvent(onResult, ClasterArr.Items[i]);|8: end; |4:end;|0:|4:end.|
AddHint(53,-29,71,13,@Hint)
}
Add(InlineCode,15174344,308,217)
{
@Hint=#12:DynamicArray|
WorkPoints=#7:doItems|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|5:type |21: ArrType = integer;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|27: Arr: array of ArrType;|9: public|25: onResult: THI_Event;|51: procedure doItems(var Data:TData; Index:word);|5: end;|0:|14:implementation|0:|30:procedure THiAsmClass.doItems;|3:var|16: i, j: integer;|5:begin|24: for i := 0 to 2099 do |7: begin|22: SetLength(Arr, i);|30: for j := 0 to High(Arr) do|18: Arr[j] := j;|30: for j := 0 to High(Arr) do|36: _hi_onEvent(onResult, Arr[i]);|8: end; |4:end;|0:|4:end.|
AddHint(57,-20,80,13,@Hint)
}
Add(Label,9310781,308,168)
{
Left=95
Top=15
Height=17
}
Add(Label,9307311,98,84)
{
Left=15
Top=15
Width=63
Height=17
Caption="ClasterArray:"
}
Add(Label,552797,308,259)
{
Left=95
Top=40
Height=17
}
Add(Label,6667527,91,77)
{
Left=15
Top=40
Width=72
Height=17
Caption="DynamicArray:"
}
Add(TimeCounter,8168703,245,126)
{
link(onStart,6775550:doItems,[])
link(onStop,9310781:doText,[(293,139)(293,174)])
}
Add(Hub,12900450,203,126)
{
OutCount=4
link(onEvent1,8168703:doStart,[])
link(onEvent2,8168703:doStop,[])
link(onEvent3,15466341:doStart,[(231,146)(231,223)])
link(onEvent4,15466341:doStop,[(227,153)(227,230)])
}
Add(TimeCounter,15466341,245,217)
{
link(onStart,15174344:doItems,[])
link(onStop,552797:doText,[(293,230)(293,265)])
}
Add(Button,12697595,147,126)
{
Left=145
Top=70
TabOrder=-1
link(onClick,12900450:doEvent1,[])
}

У меня следующий результат в msec:

ClasterArray -- 105
DynamicArray -- 87

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

0
Ответов: 9906
Рейтинг: 351
#214: 2012-04-10 19:44:49 ЛС | профиль | цитата
Комментировать _hi_onEvent(onResult.... -- не пробовал ???
карма: 9

1
Голосовали:sla8a
Ответов: 8926
Рейтинг: 823
#215: 2012-04-10 21:11:33 ЛС | профиль | цитата
nesco, или на выход что-нибудь поставить, а то жалко, пропадают данные в никуда code_27605.txt
------------ Дoбавленo в 21.11:
В первом случае 4 на 12 мсек, во втором 515/532
карма: 19

0
файлы: 1code_27605.txt [5.7KB] [250]
Разработчик
Ответов: 26158
Рейтинг: 2127
#216: 2012-04-10 22:42:56 ЛС | профиль | цитата
Galkov писал(а):
Комментировать _hi_onEvent(onResult.... -- не пробовал ???

Да надо было, к тому же, там и так ошибка -- вместо i нужно было j поставить.
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#217: 2012-04-10 23:17:46 ЛС | профиль | цитата
Элементы массива всегда располагаются в последовательных ячейках памяти,
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26158
Рейтинг: 2127
#218: 2012-04-11 00:28:49 ЛС | профиль | цитата
Tad писал(а):
Элементы массива всегда располагаются в последовательных ячейках памяти

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

Ладно, пес с ним, продолжим исследования. Следующий этап -- аля, привет MT. Исследования цепочного кластерного массива. Результаты у него получаются лучше, чем у табличного. Немного странно, но...???

code_27608.txt

У меня следующий результат с отключенным выходом:

ClasterArray -- 14
ChainArray -- 11
DynamicArray -- 3
карма: 22

0
файлы: 1code_27608.txt [11.3KB] [334]
Ответов: 8926
Рейтинг: 823
#219: 2012-04-11 11:53:03 ЛС | профиль | цитата
nesco Win7, 3.2 ГГц
ClasterArray -- 13,3
ChainArray -- 10,6
DynamicArray -- 3,5
карма: 19

0
Ответов: 1528
Рейтинг: 57
#220: 2012-04-11 12:02:31 ЛС | профиль | цитата
nesco, это ведь аналог "List"(не знаю как в делфях имя), так и надо сравнивать с ним
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#221: 2012-04-11 13:20:46 ЛС | профиль | цитата
nesco, насколько я знаю при каждом SetLength, если длинна становится больше предыдущей, то происходит резирвирование новой памяти с достаточной длинной и "старый массив" копируется в новую память. Потом "старый массив" уничтожается.
Может появилось что-то новое в теории дин.массивов ?
Тут в теме даже мелькало, что массив может быть раскидан по памяти кусками.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26158
Рейтинг: 2127
#222: 2012-04-11 13:44:45 ЛС | профиль | цитата
Tad писал(а):
насколько я знаю при каждом SetLength, если длинна становится больше предыдущей, то происходит резирвирование новой памяти с достаточной длинной и "старый массив" копируется в новую память. Потом "старый массив" уничтожается.

Все правильно, так оно и работает. В любом случае, выделяется память всегда кластером, называемым грануляцией, но это значение, как правило, постоянно, и равно, ЕМНИП, 65536 байт для сиcтем Win.

hitman249 писал(а):
это ведь аналог "List"

Не все, только табличный кластерный массив использует List для хранения указателей на кластеры. Цепочный кластерный массив -- аналог нашей MT технологии, где каждый элемент цепи -- это структура, состоящая из заголовка и, собственно, самого массива, и он работает быстрее табличного
------------ Дoбавленo в 13.34:
Я просто рассмотрел алгоритм разных построений кластерного массива для создания такого же кластерного массива из дискретных элементов пакета
------------ Дoбавленo в 13.44:
Вот, собственно, аналог такого массива на рассыпухе. Работает только на увеличение, на уменьшение не позволяет один элемент, который неплохо бы допилить. Получилось что-то среднее между цепочным и табличным алгоритмом, но концепция доступа к элементам одна. При небольшой переделке можно из этой схемы сделать схему с матрицей любых допустимых данных
карма: 22

1
файлы: 1hiasm_clasterarray_001.sha [8.3KB] [247]
Голосовали:ser_davkin
Ответов: 9906
Рейтинг: 351
#223: 2012-04-11 14:02:23 ЛС | профиль | цитата
Tad писал(а):
то происходит резервирование новой памяти с достаточной длинной и "старый массив" копируется в новую память. Потом "старый массив" уничтожается.
Почти все правильно.
За исключением того, что НЕ ФАКТ, что копируется. Зависит от библиотек и API оси.
В случае виртуальной памяти, реаллокация может происходить и без копирования. Типа:
1) освобождается виртуальная область "старого" массива. А физическая память-то с данными никуда не девается - целехонькая остается.
2) находится в приложении непрерывная область большего размера.
3) мэпятся в начало этой области старые данные.
4) и все тип-топ

Такие фокусы кроме ОСИ никто не имеет право делать. И, вроде бы, в винде есть API по фамилии Realloc, если ты выделил себе память через создание хипа... Если мне не изменяет мой склероз...
НО, кажется, Дельфи не умничает с динамическими массивами и строками -- тупо копирует. А вот с WString - все может быть, там все через api оси делается.

Чего это еще дает.
В 32-х битном приложении у тебя всего 2Г виртуалки. Есть у тебя массив размером с 1Г -- и дулю с маком ты ему даже один байт прибавишь (в случае копирования)
А если по правильному (на что мы никак повлиять не можем) -- так без проблем

карма: 9

0
Ответов: 16884
Рейтинг: 1239
#224: 2012-04-11 15:12:42 ЛС | профиль | цитата
Galkov, привет!
Товарищ по фамилии Realloc делает то же самое : Если для расширения массива непрерывной памяти не хватает, будет выделено место в непрерывной области памяти, а "старая" область памяти освободится. Текущие данные перепишутся на новое место.
Если места хватает, то Delphi по SetLength тоже просто добавит новые эламенты в конец текущего.
Это если мне не изменяет мой склероз...
А вот того, что, как выше утверждалось,
Вон с теми же динамическими массивами : если не знаешь, что они работают на разбросанных по оперативке кусочках памяти и указателях
я не знал.


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 3889
Рейтинг: 362
#225: 2012-04-11 15:25:31 ЛС | профиль | цитата
Tad, там речь идёт о многомерных динамических массивах, которые работают через массив указателей (на указатели) на массивы данных, обрабатываемые менеджером памяти независимо друг от друга по мере обращения. Как именно происходит изменение размера одномерного массива в большую сторону нужно отдельно смотреть.
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)