1012 / 116 / 2
Регистрация: 26.08.2011
Сообщений: 1,088
Записей в блоге: 2
1

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

18.07.2017, 11:53. Показов 1257. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2017, 11:53
Ответы с готовыми решениями:

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

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

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

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

10
414 / 262 / 82
Регистрация: 27.10.2012
Сообщений: 857
18.07.2017, 17:45 2
если n изменяется то ReDim Preserve не прокатит
0
1012 / 116 / 2
Регистрация: 26.08.2011
Сообщений: 1,088
Записей в блоге: 2
18.07.2017, 23:29  [ТС] 3
нет. n в данном случае константна. определяется при загрузке формы и дальше не меняется. мало того вся систем работает 100-500 раз а потом умирает. Типа out of memory случается...
0
5557 / 1363 / 150
Регистрация: 08.02.2009
Сообщений: 4,106
Записей в блоге: 30
18.07.2017, 23:59 4
В принципе-то я не в курсе, но, на примере темы 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 5
Возможно, такое происходит из-за фрагментации памяти (ОЗУ, а не дисковая подсистема). Обычно это решается (на С) изначальным резервированием достаточного размера пула памяти и затем его управлением. На VB инструменты для непосредственного манипулирования памятью отсутствуют, хотя, может быть, возможно это реализовать с помощью системных функций, но в любом случае, писать модуль управления распределением памяти штука не из самых простых. Вероятно есть другие пути решения этой проблемы или вообще, проблема заключается в другом, здесь лучше всего внимательно протестировать Вашу программу, проанализировать и подумать.

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от Homarty Посмотреть сообщение
Если размеры массива не меняются
К сожалению, меняются.
Этот массив вообще резиновый. Он является источником данных. но если массив, обрабатываемый по источнику данных, вдруг содержит новую, неизвестную источнику инфу, то эта инфа добавляется в массив-источник. Такая ботва: два массива друг друга учат и копят информацию.
0
414 / 262 / 82
Регистрация: 27.10.2012
Сообщений: 857
19.07.2017, 18:55 7
Покажите пример в файле. А то так и останетесь со своими "протечками".
0
1012 / 116 / 2
Регистрация: 26.08.2011
Сообщений: 1,088
Записей в блоге: 2
19.07.2017, 22:16  [ТС] 8
kalbasiatka, я не могу показать пример в файле. Попытка выделить проблему в отдельный файл - не удалась:проблема оказалась решенной
Случайно залез в стек и узрел ..
Но утечка памяти - на самом деле серьезная проблема, для которой, как я понял стандартных решений в VBA - кот наплакал.
0
Эксперт WindowsАвтор FAQ
17829 / 7564 / 889
Регистрация: 25.12.2011
Сообщений: 11,314
Записей в блоге: 17
22.07.2017, 06:14 9
Цитата Сообщение от 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 10
При выполнении erase для динамического массива происходит декремент ссылок членов массива, но это не гарантирует вызов деструктора для всех них, если учитывать, что ссылки на объекты были откуда-нибудь скопированы, например , с листа Ексель. И надо принимать во внимание, что программа интенсивно работает со строковыми данными, т.е. постоянно удаляет/добавляет их. Хотя, волне возможно (даже вероятнее всего), что в Екселе есть свой менеджер памяти и волноваться по этому поводу его пользователям нет необходимости.
Тесты для динамических массивов видел, интересно, косвенное подтверждение работы менеджера памяти.
0
Эксперт WindowsАвтор FAQ
17829 / 7564 / 889
Регистрация: 25.12.2011
Сообщений: 11,314
Записей в блоге: 17
22.07.2017, 07:38 11
Спасибо за поправку, да, разумеется, деструктор будет вызван только когда кол-во ссылок на объект достигнет 0.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2017, 07:38
Помогаю со студенческими работами здесь

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

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

Как работать с большими числами?
Пытаюсь записать и вывести большое число. Запись числа //Дата в миллисекундах...

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

Как работать с очень большими числами?
Как можно складывать, вычитать, умножать друг на друга очень большие числа, которые не вмещаются...

Как быстро работать с большими текстовыми файлами?
моя цель: есть текстовой файл весом 4 мб все строчки которые начинаются с v переписать в другой...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru