Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Частый вызов SetLength(Count+10)


Страницы:   1 2

@!!ex ©   (2007-12-02 19:18:00) 

Может ли вызвать ошибку?
Просто есть контейнер, доюалвение в который реализовано так:
procedure TNoise.Add(Position:TVector; LifeTime:integer; bSize:single; Const Color:TVector);
begin
 inc(Count);
 if Count>Size then begin
   inc(Size,500);
   SetLength(Items,Size);
 end;
 Items[Count-1]:=TWaterNoise.Create(Position,LifeTime,bSize,Color);
end;

И при этом в него засовывается около 500 объектов.
Проект начал падать, есть основания полагатЬ, что ошибка в контейнере.
Но там ничего страшщного не происходит, кроме такого фигового ресайза массива.


Loginov Dmitry   (2007-12-03 22:49:00) [1]

> [20] Anatoly Podgoretsky ©   (03.12.07 12:03)


D7: 20 минут пришлось ждать, пока счетчик достигнет значения 10000000 (был выставлен "высокий" приоритет). Заняло ок. 400Мб оперативки. Не свалилось. Видимо, вероятность возникновения OutOfMemory как-то зависит от производительности железа (тестировалось на Athlon 64 X2 Dual 4600+  2ГБ ОЗУ).


Anatoly Podgoretsky   (2007-12-03 19:25:00) [2]

Да просто тест требует свыше 2 гб памяти, даже без учета фрагментации.


SergeyIT   (2007-12-03 19:05:00) [3]

> Как я вас поймал с примером
Нормальный тест. Просто try ... except поставить надо и освободить память.


Kolan   (2007-12-03 19:03:00) [4]

> То что я не знал о его существовании, когда писал все это.
> Сейчас переделывать поздно, ибо завтра сдавать готовый проект
> надо.

А что массив объектов оч. сложно переделать на TObjectList? Изменить Add и все, а обрашение точно такой же синтаксис имеет…


Anatoly Podgoretsky   (2007-12-03 18:55:00) [5]

Как я вас поймал с примером :-)
Конечно цикл надо уменьшить минимум в два раза.


Sapersky   (2007-12-03 15:16:00) [6]

Примерно 2 месяца назад была ветка "Резкое увеличение размера динамического массива", но, похоже, ушла в архив.
Там пример перебора всех файлов на диске с SetLength(Arr, Count + 1) вылетал по OutOfMemory.


Сергей М.   (2007-12-03 14:22:00) [7]


> на такие грабли уже наткыался, и опять


На то они и грабли, бледнолицый)


sniknik   (2007-12-03 14:11:00) [8]

> в D7 - OutOfMemory (сожрала гиг оперы и почти полтора гига из свапа)
всего 2 гига? так это нормально, st := st + '12345678901234567890'; повторенная 100000000 раз, сделает строку как раз под 2 гига.
а для того чтобы выделить под новое добавление, еше такой же размер + 20  вот тут и OutOfMemory.


Leonid Troyanovsky   (2007-12-03 14:11:00) [9]


> MBo ©   (03.12.07 10:30) [12]

> я помню, менеджер памяти мог не успевать,


> SergeyIT ©   (03.12.07 12:29) [21]

> [20] - ошибка - OutOfMemory.


> antonn ©   (03.12.07 13:58) [22]

> в D7 - OutOfMemory

Это, конечно, здорово, но OOM это, все же, не AV.
Может, до открытия новых обстоятельств,
отпустим ММ на поруки?

--
Regards, LVT.


MBo   (2007-12-03 14:06:00) [10]

to 100 000 000  -  многовато, конечно - строка в 2 гигабайта получится
А в 10 раз меньше - нормально - при своевременном освобождении памяти не более гига понадобится


@!!ex   (2007-12-03 14:04:00) [11]

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


antonn   (2007-12-03 13:58:00) [12]


> Anatoly Podgoretsky ©   (03.12.07 12:03) [20]

в D7 - OutOfMemory (сожрала гиг оперы и почти полтора гига из свапа)
:(


SergeyIT   (2007-12-03 12:29:00) [13]

В Д5
[12] - без проблем.
[20] - ошибка - OutOfMemory.


Anatoly Podgoretsky   (2007-12-03 12:03:00) [14]

> MBo  (03.12.2007 10:30:12)  [12]

Это не корректный тест, здесь просто происходит расширение массива, а поскольку блоки выше свободны, то без пересылки в новый блок памяти. Вот если в цикле что ни будь включить, что бы память нельзя было расширить, то рост будет квадратичный и будет отражать реальные ситуации. Например удлинение размера строки, на размер более например 16 символов.


st := '';
for i := 1 to 100000000 do begin
  SetLength(a, i);
  s:= s + a[0];
  st := st + '12345678901234567890';
end;


Сергей М.   (2007-12-03 12:03:00) [15]


> Anatoly Podgoretsky ©   (03.12.07 11:57) [18]


Есть, примитивная.
Тривиальная попытка объединения освобождаемого блока со смежными свободными блоками.


Anatoly Podgoretsky   (2007-12-03 11:57:00) [16]

> Сергей М.  (03.12.2007 11:53:17)  [17]

А она есть?


Сергей М.   (2007-12-03 11:53:00) [17]


> может зависеть от скорости тачки


Причем здесь "скорость тачки" ?
Сборка мусора в ММ Д7 - операция синхронная


Правильный_Вася   (2007-12-03 11:36:00) [18]


> D7 - полет нормальный.

может зависеть от скорости тачки


MBo   (2007-12-03 11:33:00) [19]

ОК, значит, и старый менеджер памяти отлично справлялся с инкрементальным увеличением дин. масива.


sniknik   (2007-12-03 10:40:00) [20]

> Кто-нибудь проверит на 5-6-7?
D7, отработало без ошибок, результат в Caption-е 0.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо