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

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

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

Студворк — интернет-сервис помощи студентам
Здоровый у меня массив. 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,218
Записей в блоге: 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,218
Записей в блоге: 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,218
Записей в блоге: 2
19.07.2017, 22:16  [ТС]
kalbasiatka, я не могу показать пример в файле. Попытка выделить проблему в отдельный файл - не удалась:проблема оказалась решенной
Случайно залез в стек и узрел ..
Но утечка памяти - на самом деле серьезная проблема, для которой, как я понял стандартных решений в VBA - кот наплакал.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 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
18030 / 7733 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru