Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458

Реальный пример медленного освобождения памяти

21.05.2013, 14:18. Показов 1964. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как-то в одной из первых своих тем на этом сайте писал про проблему с медленным освобождением памяти.
Сконструировал пример этой проблемы.
Скачиваем, переходим в IDE, находим fStart, ставим т.останова(F9) на "End function" и жмем F5. После создания объектов, и переходе интерпритатора на "End function", готовимся ... жмем опять F5 и ловим кайф от освобождения памяти (смотрим в диспетчере задач, как винда назад скатывает память постепенно и очень очень медленно) ...
"... подождите, подождите! не снимайте задачу! она через какое-то время сначала раскачается, сдуется и только потом остановится )"

Количество объектов всего 1 000 000. А представьте, если объектов миллионов 5 ... а то и гораздо больше

P.S. В данном примере объекты облегченные - без навеса обслуживающих функций, поэтому, вопрос реализации "а почему именно так?!" - будет требовать отдельной темы. Примите пожалуйста по факту, что и коллекции и счетчики - нужны ... (хотя ...) По идее (для тех кто посмотрел и в теме) - смысл оболочки(класса) "Node" будет понятен и вопросов не вызовет (по сути, это узлы графа со своими узлами и хранящейся информацией на самом узле).

Коллеги, вопроса два - как сделать аналогичную оболочку на коллекшн и/или решить проблемы с текущей оболочкой (где будут - узлы и значения), чтобы:
1. экземпляр класса занимал меньше памяти
2. быстрее освобождалась память после работы скрипта

Принимаю ЛЮБЫЕ варианты и реализации! кидайте идеи если будут - даже самые абсурдные!
Буду ОЧЕНЬ признателен и благодарен.
Вложения
Тип файла: rar 2013.05.21 - пример бага работы с памятью.rar (20.5 Кб, 9 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2013, 14:18
Ответы с готовыми решениями:

Пауза в цикле, для освобождения памяти
Еще один вопрос. В цикле через 3 секунды надо проверять наличие файла и если он появится, то рaспечатывать. Как в этом цикле сделать паузу...

Распределение памяти для выделения и освобождения блоков памяти внутри запрошенного пула
В программе малые"дыры" избегают,что нужно сделать что бы малые "дыры" не избегались.... # include <stdio.h> # include...

Ошибка освобождения памяти
Пытаюсь прочитать из файла и вывести на консоль. Файл текстовый, слова написанные в столбик. Вот код: #include <malloc.h> ...

7
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
22.05.2013, 16:17  [ТС]
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Спасибо Hedge-Hog за помощь и кое-какие идеи.
Поши дальше.
Пишем:
Visual Basic
1
2
3
4
5
6
Private Function qwe()
 Dim dКоллекция As New Collection
 For i1& = 1 To 1000000
  dКоллекция.Add Item:=New Collection, Key:=CStr(i1&)
 Next i1&
End Function
- память освобождает мгновенно

Создем абсолютно пустой класс SomeClass (без единой строчки кода)
Пишем:
Visual Basic
1
2
3
4
5
6
Private Function qwe()
 Dim dКоллекция As New Collection
 For i1& = 1 To 1000000
  dКоллекция.Add Item:=New SomeClass, Key:=CStr(i1&)
 Next i1&
End Function
- память освобождает медленно (минуты 2-3 минимум)

Добавлено через 19 минут
Идем дальше.
Пишем:
Visual Basic
1
2
3
4
5
6
Private Function qwe()
 Dim dКоллекция As New Collection
 For i1& = 1 To 500000
  dКоллекция.Add Item:=CreateObject("VBScript.RegExp"), Key:=CStr(i1&)
 Next i1&
End Function
- да, набор медленный, но освобождает мгновенно.

Вывод - VBA(или Collection) мягко говоря не любит свои классы. за что(почему) ?! - не понятно!

Добавлено через 21 минуту
Идем еще дальше:
Visual Basic
1
2
3
4
5
6
Public Function qwe()
 Dim d(500000) As SomeClass
 For i1& = 1 To 500000
  Set d(i1&) = New SomeClass
 Next i1&
End Function
- тоже освобождает медленно.
Вывод: причина не в Collection, а в VBA!
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
23.05.2013, 18:37  [ТС]
1. Как можно добраться до GC или Dispose? Уверен, что возможность есть. Кто знает, может есть какой скрытый метод?
2. Как можно сгенерить исключение в коде, которое бы прекращало бы работу программы. Причем, исключение такое, которое не просто аккуратно и корректно заканчивает работу программы (им. ввиду VBA), а вышибает (без вывода на экран сообщений об ошибке)? Мусорщик бы потом просто собрал всю резервированную память. Такие исключения бывают - могу сказать точно т.к. с такими проблемами встречался, но не могу вспомнить где и с чем.
3.
Можно создать на глобальном уровне "контейнер", куда при завершении работы программы (очередной итерации вызова того или иного скрипта) сваливать использованные экземпляры классов.
При этом, повесить на таймер функцию, которая бы постепенно разбирала эту кучу и ориентировалась на потребление приложением процессорного времени.
В связку с ней в конструкторы всех используемых классов повесить обработчики, которые бы проверяли - если куча достигла какого-то установленного предела - то устанавливался бы флаг форсированной разборки этой кучи, пока точка предела опять-таки не опустится ниже какого-то предела.

сложно? нет, не сложно, но д.быть что-то красивее.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
24.05.2013, 12:41  [ТС]
Скачиваем. Открываем. Запускаем НИЧЕГО НЕ ИЗМЕНЯЯ В КОДЕ!!! - qwe2 и qwe3. Удивляемся.
Попробуйте это объяснить.
Вложения
Тип файла: rar Книга.rar (16.5 Кб, 25 просмотров)
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
06.06.2013, 09:33  [ТС]
Спасибо anny05 за помощь. Проблемы с памятью и классами были решены. Тема закрыта.
0
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 2
13.03.2016, 13:17
Поделитесь решением?
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
14.03.2016, 10:28  [ТС]
Решения нет. И не было. Уважаемый коллега был согласен поделиться своим решением только при условии, если я напишу данное сообщение. Сообщение написал, но решение коллеги оказалось не рабочим.

Решение многих задач, которые требуют использование структуры связанных (в форме дерева) данных (которые традиционно решаются использованием объектной модели), имеется.

Добавлено через 5 минут
Обращу ваше внимание еще раз - решения проблем, освобождения памяти при работе с классами - нет. Вернее, иногда при освобождении памяти программа работала быстро, но как этого достичь и из-за чего или благодаря каким манипуляциям - выяснить не удалось.

Если ДЕЙСТВИТЕЛЬНО интересно альтернативное решение с целью решения каких-то ваших бизнес-задач, пишите. Поделюсь.
0
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 2
14.03.2016, 19:43
Цель, конечно, решение бизнес-задач и альтернативу посмотреть было бы в любом случае интересно.
Но если это уход от классов в сторону массивов и структур, то вряд ли подойдёт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2016, 19:43
Помогаю со студенческими работами здесь

С++ Проверка освобождения памяти
Добрый день. На начальном курсе С++ получил такую задачу: Написать функцию, которая получает массив строк и его размер, и...

Реальный пример MVC
Здравствуйте. Подскажите пожалуйста реальный пример приложения с MVC и как его (этот паттерн) можно нарушить или не соблюсти? В моем...

Проверка освобождения памяти (new, delete)
Всем привет. Программы помаленьку становятся сложнее. Появляются самодельные контейнеры внутри других самодельных контейнеров внутри...

Стратегия выделения/освобождения памяти
здравствуйте господа. есть такой вопрос. пусть есть класс например Bitmap - несжатое растровое изображение. Пусть необходимо уметь...

Malloc ошибка освобождения памяти
ЧЯДНТ? Косяк такой: heap corruption detected before normal block (№0) at 0x... CRT detected that the application wrote to memory...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 31.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 30.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru