![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Частый вызов SetLength(Count+10)
@!!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.