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

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

Не хватает памяти. [D5, D6, Win95/98, Win2k]


Страницы:   1 2 3

opoloXAI ©   (2004-07-12 12:02:00) 

Добрый день.
На Celeron400 с 65МГбт свободной памяти я динамически увеличиваю размер массива следующего типа:
type
TMyMassiv = record
 v1: String;
 v2: String;
 v3: Integer;
end;{record}
var
mas: array of TMyMassiv;
Увеличиваю количество элементов массива на один и добавляю новый элемент. При достижении числа элементов массива около 4000..5000 сбодной памяти остается 0 Кбт. Дальше работа программы превращается в полные "тормоза".
Вероятнее всего я нерационально отнесся к памяти, наверное стоило воспользоваться TStream. Но я не знаю как пользоваться структурой TStream of TMyMassiv. Подскажите примерчиком кода.
Заранее спасибо.


Тимохов   (2004-07-13 14:26:00) [21]

Прокомментирую ответ 29 - поправку моего ответа 15.

Действительно для оценки занимаемой памяти непустой строкой к длинне строки надо прибавлсять 21, а не 17 байт.


ASMiD   (2004-07-13 13:55:00) [22]

А я тут подумал - а если путь занимает больше 255 байт - что будет тогда? По-моему полный и непредсказуемый бардак.


Anatoly Podgoretsky   (2004-07-13 13:52:00) [23]

Тимохов ©   (13.07.04 13:06) [15]
+21


Igorek   (2004-07-13 13:44:00) [24]

Удалено модератором


Igorek   (2004-07-13 13:43:00) [25]


> Тимохов ©   (13.07.04 13:36) [24]
> только уговор - пока не переварите не делайте заявлений,
> ок? :)))

железно! :-)


Тимохов   (2004-07-13 13:41:00) [26]


> opoloXAI   (13.07.04 13:38) [25]

совет. не гадайте пока.
проверьте дома сколько все-таки памяти получается.

string[255] всегда будет занимать 256 байт, тогда как string только сколько нужно + накладные расходы.
не мудрите. выполните снаяала совет в начеле ответа.


opoloXAI   (2004-07-13 13:38:00) [27]

К сожалению на работе Delphi не стоит, смогу проверить только вечером дома. Пока спасибо, дома посмотрю.
Тогда вопрос по "лик-безу": я описываю тип:
TmySearchRec = record
  Size: Integer;
  Name: TFileName;
  Path: String;
end;
Может стоить сделать по-другому:
1) если бы не было пупи к файлу, я бы точно съэкономил место?
2) тип String, наверное, стоит описать как String[255]?
3) тип TFileName это ведь тоже String, может его стоить описать как String[25]?


Тимохов   (2004-07-13 13:36:00) [28]


> Дельфи в двух словах?


http://rsdn.ru/article/Delphi/memmanager.xml

только уговор - пока не переварите не делайте заявлений, ок? :)))


Igorek   (2004-07-13 13:33:00) [29]


> Тимохов ©   (13.07.04 13:14) [17]
> Ваш вопрос не относится ни в коей мере к теме "Фрагментация
> памяти в дельфи" :р) Задайте что-нибудь более конкретное.

Простите. Как работает менеджер памяти Дельфи в двух словах? А то я думал что его вообще нету.


Тимохов   (2004-07-13 13:29:00) [30]

Автору.

Вы перечитайте мои советы по поводу оченки занимаемой памяти под строки.
Может у вас реально занимается очень много.
Т.к. в своих оценках вы вообще игнорировали длинну строк, то может оказаться, что действительно занимается 65мб, т.к. например есть дикректоря с длинющими именами файлов.

посмотрите.


Тимохов   (2004-07-13 13:27:00) [31]


> Вложеность не сильно большая. !!??

не сильно.


opoloXAI   (2004-07-13 13:24:00) [32]

Если Вы о большой глубине катклогов, то я бы ответил, что она совсем не большая. Машина стоит на работе 1,2 ГБт занято на диске музыкой и рабочей требухой (не Windows\Temporary...). Вложеность не сильно большая. !!??


Тимохов   (2004-07-13 13:21:00) [33]

в димамический массивах проблемы вообще нет.

вы на вопрос не ответили...


opoloXAI   (2004-07-13 13:20:00) [34]


> Тогда может быть все дело в том, что сильно глубокая рукурсия?
> Большая глубина каталогов?

Получается, что проблема совсем не в динамическом массиве, и проблему "пожерания памяти" мне просто не решить?


Тимохов   (2004-07-13 13:14:00) [35]


> то непрерывный блок памяти в этом пространстве может совсем
> не быть таковым в памяти оперативной. Я прав?

не знаю.
это особенность реализации уже не менеджедра памяти дельфи, а самой ОС windows. А они это не документируют.
Вас это имхо волновать не должно.

Ваш вопрос не относится ни в коей мере к теме "Фрагментация памяти в дельфи" :р) Задайте что-нибудь более конкретное.


Igorek   (2004-07-13 13:10:00) [36]


> Тимохов ©   (13.07.04 12:45) [11]
> > Что такое фрагментация памяти знаешь?
> А вы знаете? Вы знаете как работает с фрагментами манагер
> памяти дельфи?

А вы? :-)
Если я правильно догадываюсь, то поскольку каждому приложению выделяется виртуальноепространство, то непрерывный блок памяти в этом пространстве может совсем не быть таковым в памяти оперативной. Я прав?


Тимохов   (2004-07-13 13:06:00) [37]


> Тимохов ©   (13.07.04 12:57) [14]

вообще говоря вернее так: потребляемую память на строку надо оценивать так

length(s) + 4{указатель на строку}+8{служебная инфа строки}+4{служебная инфа блока менеджера памяти дельфи }+1{возможно на #0 в конце}

т.е. длина строки + 17байт, если строка не пустая.


Тимохов   (2004-07-13 12:57:00) [38]

Автору.
Вы неверно оцениваете потребляемую память
sizeof(string) = 4. Надо брать length(string)


Тимохов   (2004-07-13 12:55:00) [39]

Автору.
Я лично не говорил, что не советую пользоваться динамическими массивами. По скорости доступа с ними никакой tlist не сравнится. А при реализации механизма count+capacity (как в tlist), то и по скорости добавления не сравнится.

ЧЕстно говоря я не вижу ошибки. Вы говорите, что вы смотрите на сильное потребление памяти в процессе работы? Тогда может быть все дело в том, что сильно глубокая рукурсия? Большая глубина каталогов?


ASMiD   (2004-07-13 12:54:00) [40]

По моему печальному и не очень опыту работы с памятью самый быстрый и достаточно надежный способ - это хапнуть много и сразу. Ведь можно же сделать предварительные прикидки - тут уже звучали и 140к и 400к это ничто в сравнении с 65М я уж молчу про файл подкачки.


Страницы:   1 2 3

Наверх

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