На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Максимальный размер массива UDT , Переполнение
    У меня структура UDT=132байта, элементов в массиве 1,559,520. Далее не хочет работать ReDim Preserve на увеличение массива. Err.Number=9 (Subscript out of range). От чего зависит размер памяти, выделяемой под массив? Как увеличить размер массива, не меняя структуру?

    Добавлено
    1559520*132=205,856,640
      Цитата BlackSun @
      У меня структура UDT=132байта

      Это с учётом служебки или только размер данных? Вангую, что второе... а объём хранения на элемент байтов на 40 больше.
      Да и нафига такой массив?
        LenB=132
          BlackSun
          ExpandedWrap disabled
            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
            вопрос не в этом
              С чего ты так думаешь? Я тебе показываю же, что рассчитанный тобой размер никак не соотносится с реально потребным под него объёмом памяти - там, где ты рассчитываешь на 200 метров, могут в реальности кушаться и все 500. А умение M$ сформулировать сообщение об ошибке, никак не соотносящееся с собственно ошибкой, известно практически каждому.
                У меня нет строк в структуре. Какое ограничение памяти под массив?

                Добавлено
                Размер служебки постоянен и равен 40б?
                  Цитата BlackSun @
                  Размер служебки постоянен

                  Нет.
                  Цитата
                  With user-defined types, LenB returns the in-memory size, including any padding between elements.
                    Цитата
                    элементов в массиве 1,559,520

                    Вроде не много... а в VB есть коллекции?

                    Цитата
                    Как увеличить размер массива, не меняя структуру?

                    Сделать "страничное хранение". Например, есть некая коллекция из 800 000 000 элементов, но, по факту, эта коллекция не один массив, а n массивов фиксированной длинны. Организацию доступа к конкретному элементу такой коллекции придётся придумать... в vb пригодились бы property :D

                    А вообще, должны быть нативные коллекции, или что то в этом роде, уверен, тот же std::vector обязанны были прикрутить каким нибудь макаром...
                      Да ну, коллекции жутко тормозные... Мне интересно, это VB ограничивает размер массива или же нет, памяти вроде предостаточно...
                        Цитата
                        VB ограничивает размер массива или же нет, памяти вроде предостаточно...

                        Фраза "Памяти предостаточно" весьма спорная. Ты ведь не знаешь как эти элементы реально укладываются в память, и не факт что текущий уровень фрагментации памяти на это не влияет.

                        По поводу "тормознутости" коллекций, полностью не согласен. Если правильно подбирать реализацию коллекции, разность в скорости доступа/записи к элементам массива и коллекции не будет заметна.
                          Цитата BlackSun @
                          Мне интересно, это VB ограничивает размер массива или же нет, памяти вроде предостаточно...

                          VB не должен ничего ограничивать. Если только ты сам вместо переменной Long по ошибке используешь Integer и получишь отрицательное значение UBound.
                          А насчет памяти учти, что для Redim Preserve может понадобиться удвоенный размер памяти - под старый массив и под новый. 200+200 Мб вроде тоже не много, но тут все зависит от фрагментации адресного пространства (АП) процесса. Если ты кроме этого массива попутно сохраняешь еще какие-то объемные данные, то в итоге может оказаться, что свободное АП порублено на куски размером < 200 Мб - суммарного свободного объема "вроде предостаточно", а непрерывного куска в > 200 Мб нет
                            Сейчас у меня массив UDT LenB=252 при 663893 элементах (итого 167млн байт данных) приводит к ошибке "Overflow". Я оказался явно зажат в какие-то тесные рамки. Может система ограничивает память процессу и можно как-то потребовать от системы выделить больше памяти?

                            Добавлено
                            И как можно расчитать оптимальный размер элемента UDT, чтобы он вместе со служебными данными занимал меньше памяти? UDT внутри выравнивается по границе 4 байта вроде, а межэлементное выравнивание сколь байт будет?
                            Сообщение отредактировано: BlackSun -
                              Цитата BlackSun @
                              Я оказался явно зажат в какие-то тесные рамки. Может система ограничивает память процессу и можно как-то потребовать от системы выделить больше памяти?

                              На лицо архитектурная ошибка, а вы пытаетесь выстраивать фундамент из костылей...


                              Для выделения доп. памяти нужно работать с x64 архитектурой программ, либо, генерить дочерние процессы, на каждый дочерний процесс вы сможете получить максимум по ~3,5ГиБ

                              Добавлено
                              Цитата BlackSun @
                              итого 167млн байт данных

                              Как вы это узнали?

                              Добавлено
                              Цитата BlackSun @
                              UDT внутри выравнивается по границе 4 байта вроде, а межэлементное выравнивание сколь байт будет?

                              Я не эксперт в этом, но, всё это не истинно. Есть параметры компиляции, есть оптимизация, - от всего этого один и тот же код будет генерироваться разными способами, и выравнивание будет разным.
                                Цитата BlackSun @
                                Overflow

                                Покажи структуру и как ReDim'ишь.

                                Добавлено
                                Цитата VisualProg @
                                По поводу "тормознутости" коллекций, полностью не согласен. Если правильно подбирать реализацию коллекции, разность в скорости доступа/записи к элементам массива и коллекции не будет заметна.

                                Коллекция организует совсем другой способ хранения данных чем линейный массив. Коллекция - это красно-черное дерево - http://www.cyberforum.ru/visual-basic/thread1801288.html
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0393 ]   [ 17 queries used ]   [ Generated: 19.03.24, 04:16 GMT ]