Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.237.245.80] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
У меня структура UDT=132байта, элементов в массиве 1,559,520. Далее не хочет работать ReDim Preserve на увеличение массива. Err.Number=9 (Subscript out of range). От чего зависит размер памяти, выделяемой под массив? Как увеличить размер массива, не меняя структуру?
Добавлено 1559520*132=205,856,640 |
Сообщ.
#2
,
|
|
|
Цитата BlackSun @ У меня структура UDT=132байта Это с учётом служебки или только размер данных? Вангую, что второе... а объём хранения на элемент байтов на 40 больше. Да и нафига такой массив? |
Сообщ.
#3
,
|
|
|
LenB=132
|
Сообщ.
#4
,
|
|
|
BlackSun
private type mytype s as string end type sub button_click() dim s as mytype s.s = "" debug.print "str len = 0, lenb=" & lenb(s) s.s = space(1024) debug.print "str len = 1024, lenb=" & lenb(s) end sub |
Сообщ.
#5
,
|
|
|
вопрос не в этом
|
Сообщ.
#6
,
|
|
|
С чего ты так думаешь? Я тебе показываю же, что рассчитанный тобой размер никак не соотносится с реально потребным под него объёмом памяти - там, где ты рассчитываешь на 200 метров, могут в реальности кушаться и все 500. А умение M$ сформулировать сообщение об ошибке, никак не соотносящееся с собственно ошибкой, известно практически каждому.
|
Сообщ.
#7
,
|
|
|
У меня нет строк в структуре. Какое ограничение памяти под массив?
Добавлено Размер служебки постоянен и равен 40б? |
Сообщ.
#8
,
|
|
|
Цитата BlackSun @ Размер служебки постоянен Нет. Цитата With user-defined types, LenB returns the in-memory size, including any padding between elements. |
Сообщ.
#9
,
|
|
|
Цитата элементов в массиве 1,559,520 Вроде не много... а в VB есть коллекции? Цитата Как увеличить размер массива, не меняя структуру? Сделать "страничное хранение". Например, есть некая коллекция из 800 000 000 элементов, но, по факту, эта коллекция не один массив, а n массивов фиксированной длинны. Организацию доступа к конкретному элементу такой коллекции придётся придумать... в vb пригодились бы property А вообще, должны быть нативные коллекции, или что то в этом роде, уверен, тот же std::vector обязанны были прикрутить каким нибудь макаром... |
Сообщ.
#10
,
|
|
|
Да ну, коллекции жутко тормозные... Мне интересно, это VB ограничивает размер массива или же нет, памяти вроде предостаточно...
|
Сообщ.
#11
,
|
|
|
Цитата VB ограничивает размер массива или же нет, памяти вроде предостаточно... Фраза "Памяти предостаточно" весьма спорная. Ты ведь не знаешь как эти элементы реально укладываются в память, и не факт что текущий уровень фрагментации памяти на это не влияет. По поводу "тормознутости" коллекций, полностью не согласен. Если правильно подбирать реализацию коллекции, разность в скорости доступа/записи к элементам массива и коллекции не будет заметна. |
Сообщ.
#12
,
|
|
|
Цитата BlackSun @ Мне интересно, это VB ограничивает размер массива или же нет, памяти вроде предостаточно... VB не должен ничего ограничивать. Если только ты сам вместо переменной Long по ошибке используешь Integer и получишь отрицательное значение UBound. А насчет памяти учти, что для Redim Preserve может понадобиться удвоенный размер памяти - под старый массив и под новый. 200+200 Мб вроде тоже не много, но тут все зависит от фрагментации адресного пространства (АП) процесса. Если ты кроме этого массива попутно сохраняешь еще какие-то объемные данные, то в итоге может оказаться, что свободное АП порублено на куски размером < 200 Мб - суммарного свободного объема "вроде предостаточно", а непрерывного куска в > 200 Мб нет |
Сообщ.
#13
,
|
|
|
Сейчас у меня массив UDT LenB=252 при 663893 элементах (итого 167млн байт данных) приводит к ошибке "Overflow". Я оказался явно зажат в какие-то тесные рамки. Может система ограничивает память процессу и можно как-то потребовать от системы выделить больше памяти?
Добавлено И как можно расчитать оптимальный размер элемента UDT, чтобы он вместе со служебными данными занимал меньше памяти? UDT внутри выравнивается по границе 4 байта вроде, а межэлементное выравнивание сколь байт будет? |
Сообщ.
#14
,
|
|
|
Цитата BlackSun @ Я оказался явно зажат в какие-то тесные рамки. Может система ограничивает память процессу и можно как-то потребовать от системы выделить больше памяти? На лицо архитектурная ошибка, а вы пытаетесь выстраивать фундамент из костылей... Для выделения доп. памяти нужно работать с x64 архитектурой программ, либо, генерить дочерние процессы, на каждый дочерний процесс вы сможете получить максимум по ~3,5ГиБ Добавлено Цитата BlackSun @ итого 167млн байт данных Как вы это узнали? Добавлено Цитата BlackSun @ UDT внутри выравнивается по границе 4 байта вроде, а межэлементное выравнивание сколь байт будет? Я не эксперт в этом, но, всё это не истинно. Есть параметры компиляции, есть оптимизация, - от всего этого один и тот же код будет генерироваться разными способами, и выравнивание будет разным. |
Сообщ.
#15
,
|
|
|
Цитата BlackSun @ Overflow Покажи структуру и как ReDim'ишь. Добавлено Цитата VisualProg @ По поводу "тормознутости" коллекций, полностью не согласен. Если правильно подбирать реализацию коллекции, разность в скорости доступа/записи к элементам массива и коллекции не будет заметна. Коллекция организует совсем другой способ хранения данных чем линейный массив. Коллекция - это красно-черное дерево - http://www.cyberforum.ru/visual-basic/thread1801288.html |