Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,206
Записей в блоге: 2

Как правильно работать с большими массивами?

18.07.2017, 11:53. Показов 1723. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здоровый у меня массив. 30000 строк. И постоянно обновляется.
Я его постоянно очищаю
Visual Basic Скопировано
1
 If IsArray(MaxMas2) = True Then Erase MaxMas2
и перенаполняю.
Visual Basic Скопировано
1
2
3
4
 MaxMas2 = Range(Cells(n, 22), Cells(1, 1)).Value
...
goriz=36
ReDim Preserve MaxMas2(1 To n, 1 To goriz)
и после выполнения нескольких десятков операций возникает ошибка нехватки памяти.
Может я что-то забыл сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2017, 11:53
Ответы с готовыми решениями:

Как работать с большими массивами больших чисел
Есть задача http://www.spoj.pl/problems/LUCKYN/ В двух словах, надо быстро выводить числа, состоящие только из "4" и...

Как правильно работать в MariaDB с массивами
Здравствуйте, возникла необходимость хранить массив в БД MariaDB . В массиве может храниться разное количество элементов (айди...

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

10
 Аватар для kalbasiatka
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
18.07.2017, 17:45
если n изменяется то ReDim Preserve не прокатит
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,206
Записей в блоге: 2
18.07.2017, 23:29  [ТС]
нет. n в данном случае константна. определяется при загрузке формы и дальше не меняется. мало того вся систем работает 100-500 раз а потом умирает. Типа out of memory случается...
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
18.07.2017, 23:59
В принципе-то я не в курсе, но, на примере темы SkyKing, предлагаю сбрасывать вот так:
Цитата Сообщение от Sasha_Smirnov Посмотреть сообщение
Visual Basic Скопировано
1
2
Set krupa = Nothing ' стёрли использованный словарь…
Set randel = Nothing ' …и массив коэффициентов
1
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
19.07.2017, 03:16
Возможно, такое происходит из-за фрагментации памяти (ОЗУ, а не дисковая подсистема). Обычно это решается (на С) изначальным резервированием достаточного размера пула памяти и затем его управлением. На VB инструменты для непосредственного манипулирования памятью отсутствуют, хотя, может быть, возможно это реализовать с помощью системных функций, но в любом случае, писать модуль управления распределением памяти штука не из самых простых. Вероятно есть другие пути решения этой проблемы или вообще, проблема заключается в другом, здесь лучше всего внимательно протестировать Вашу программу, проанализировать и подумать.

Добавлено через 5 минут
Проверьте также программу на утечки памяти.

Добавлено через 10 минут
Если размеры массива не меняются, то можно поэкспериментировать со статическим массивом.
1
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,206
Записей в блоге: 2
19.07.2017, 11:16  [ТС]
Sasha_Smirnov, a чем Nothing отличается от Erase?

Добавлено через 47 секунд
Цитата Сообщение от Homarty Посмотреть сообщение
Проверьте также программу на утечки памяти.
А вот это уже очень интересно. Как это делается?

Добавлено через 2 минуты
Цитата Сообщение от Homarty Посмотреть сообщение
Если размеры массива не меняются
К сожалению, меняются.
Этот массив вообще резиновый. Он является источником данных. но если массив, обрабатываемый по источнику данных, вдруг содержит новую, неизвестную источнику инфу, то эта инфа добавляется в массив-источник. Такая ботва: два массива друг друга учат и копят информацию.
0
 Аватар для kalbasiatka
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
19.07.2017, 18:55
Покажите пример в файле. А то так и останетесь со своими "протечками".
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,206
Записей в блоге: 2
19.07.2017, 22:16  [ТС]
kalbasiatka, я не могу показать пример в файле. Попытка выделить проблему в отдельный файл - не удалась:проблема оказалась решенной
Случайно залез в стек и узрел ..
Но утечка памяти - на самом деле серьезная проблема, для которой, как я понял стандартных решений в VBA - кот наплакал.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18023 / 7726 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.07.2017, 06:14
Цитата Сообщение от AndreA SN Посмотреть сообщение
и после выполнения нескольких десятков операций возникает ошибка нехватки памяти.
Erase, как и Redim или redim preserve (в сторону уменьшения индекса) корректно очищают элементы массива, освобождают память, занимаемую им, а также уменьшают кол-во ссылок на объект, если одному из элементов массива была присвоена таковая, в результате чего вызывается деструктор класса. Здесь не будет проблем.
В коде выше у вас присваиваются просто значения, даже не объект.
Цитата Сообщение от AndreA SN Посмотреть сообщение
Попытка выделить проблему в отдельный файл - не удалась:проблема оказалась решенной
Очевидно, что проблема не в массивах, а в объектах где-то ещё в коде, которые не освобождаются должным образом.
Цитата Сообщение от Homarty Посмотреть сообщение
Возможно, такое происходит из-за фрагментации памяти (ОЗУ, а не дисковая подсистема).
Redim preserve не приводит к фрагментации памяти. Рантайм выделяет новый блок памяти*. Копирует в него старый массив, после чего он уничтожается. В частности именно это приводит с сильному замедлению, когда кто-то, например, делает в цикле redim preserve +1 с огромными массивами вместо одноразового выделения достаточно большого объема, чтобы поместить туда все данные.

*В некоторых случаях менеджер памяти не выделяет новый участок для копирования туда массива целиком. Это происходит, когда в конце массива есть достаточно non-committed страниц памяти, чтобы выделить там место для операции 'redim preserve' таким образом, чтобы данные массива располагались последовательно (не были разорваны).
Вот здесь вообщем-то проводили тесты.
Цитата Сообщение от AndreA SN Посмотреть сообщение
Visual Basic Скопировано
1
MaxMas2 = Range(Cells(n, 22), Cells(1, 1)).Value
Здесь тоже можно "оптимизировать" массив.
Например, задать явный тип данных вместо Variant и заполнять массив на основе событийной схемы, чтобы данные параллельно записывались и в ячейки, и в массив.
Все будет сильно зависеть от реализации программы. Это может снизить занимаемый объем, но замедлить работу.
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
22.07.2017, 07:03
При выполнении erase для динамического массива происходит декремент ссылок членов массива, но это не гарантирует вызов деструктора для всех них, если учитывать, что ссылки на объекты были откуда-нибудь скопированы, например , с листа Ексель. И надо принимать во внимание, что программа интенсивно работает со строковыми данными, т.е. постоянно удаляет/добавляет их. Хотя, волне возможно (даже вероятнее всего), что в Екселе есть свой менеджер памяти и волноваться по этому поводу его пользователям нет необходимости.
Тесты для динамических массивов видел, интересно, косвенное подтверждение работы менеджера памяти.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18023 / 7726 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.07.2017, 07:38
Спасибо за поправку, да, разумеется, деструктор будет вызван только когда кол-во ссылок на объект достигнет 0.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2017, 07:38
Помогаю со студенческими работами здесь

Как работать с большими XML
На стороннем сайте лежит XML, все товары магазина с описанием. 50 Мб. Мне нужны из этого файла только остатки товара. Это что...

Как работать с большими числами
Если нужно с числами длиной 128 бит или больше. Есть ли встроенный тип данных для таких размеров.

Как работать с большими словарями
Здравствуйте! Подскажите пожайлуста как работать с большими словарями: в файле храниться словарь с большим количеством слов,...

Как работать с большими числами?
Пытаюсь записать и вывести большое число. Запись числа //Дата в миллисекундах $date=(time())*1000; //Тут записываем в БД ...

Как работать с большими текстами?
Что посоветуете чтоб программка начала работать с большими текстами. С небольшой строкой у нас считвывает нормально, а с длинной считывание...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Полностью асинхронный счётчик на логике (сумматорах) трёх состояний и асинхронных регистрах трёх состояний. Структура "электронный Buttom Up"
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер