На главную Наши проекты:
Журнал   ·   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 , Переполнение
    Цитата TheTrik @
    красно-черное дерево

    можно графически?
    ExpandedWrap disabled
      Public Type struFileInfo
          Idx As Long
          Info As String * 124
      End Type
      Public aFileInfo() As struFileInfo
      ...
      ReDim Preserve aFileInfo(i)
      Цитата BlackSun @
      можно графически?

      https://ru.wikipedia.org/wiki/%D0%9A%D1%80%...%B5%D0%B2%D0%BE
      Цитата BlackSun @
      ExpandedWrap disabled
        Public Type struFileInfo
            Idx As Long
            Info As String * 124
        End Type
        Public aFileInfo() As struFileInfo
        ...
        ReDim Preserve aFileInfo(i)

      Здесь overflow может случится из-за переполнения переменной i. При нехватке памяти ты получишь Out of memory.
      Сообщение отредактировано: TheTrik -
        Цитата TheTrik @
        Коллекция организует совсем другой способ хранения данных чем линейный массив

        Так я ни слова не говорил ни о линейности, ни о массивах :blink:
        Коллекция - это всего лишь интерфейс, а реализацией уже пусть сам решает что ему надо, поведение массива, поведение связанных списков, множества, карты-словари, да что угодно. И да, хранение данных в коллекциях, как раз, реализуется таким образом, чтобы не получать такие ситуации как вышло у ТС, я же намекнул на многостраничное хранение данных и множества более мелких массивов) Автор же настаивает на массиве-монстре, всё в одном, да ещё и в линейном виде...
        Сообщение отредактировано: VisualProg -
          Цитата VisualProg @
          Так я ни слова не говорил ни о линейности, ни о массивах

          Имелась в виду встроенная в VB6 реализация коллекции которую я привел по ссылке - Collection.
          Цитата VisualProg @
          И да, хранение данных в коллекциях, как раз, реализуется таким образом, чтобы не получать такие ситуации как вышло у ТС

          Мы еще не выяснили что там произошло у ТС, поскольку его ошибка вызвана не нехваткой памяти. За нелинейность придется также заплатить фрагментацией, скоростью и дополнительной памятью. Большой линейный массив данных нужно организовывать через файл-маппинг.
          Сообщение отредактировано: TheTrik -
            Цитата TheTrik @

            Здесь overflow может случится из-за переполнения переменной i

            i As Long
            Ошибка при i=663893.
            err.Description="Out of memory"

            Цитата VisualProg @
            многостраничное хранение данных
            что имеется ввиду?
            Сообщение отредактировано: BlackSun -
              Цитата BlackSun @
              i As Long

              Redim не генерирует Overflow исключение.
                Сейчас выдало Out of memory, но ранее было Overflow, удивительно... Хотя, может я что-то напутал.
                  Цитата BlackSun @
                  Сейчас выдало Out of memory, но ранее было Overflow, удивительно... Хотя, может я что-то напутал.

                  Значит не хватает нужного куска памяти. Меняй организацию данных. Во-первых, все ли 124 символа всегда используются? МБ сделать ее динамической? Во-вторых, String - UNICODE строка, нужен ли юникод? МБ обойтись многобайтовой реализацией? В-третьих, если доступ к данным в основном последовательный (не рандомный), то сделай фиксированный буфер и перехватывай ошибку обращения вне диапазона - подгружай нужную часть и корректируй индекс - идеально через файл-маппинг, система сама будет обновлять данные.
                    Строка используется полностью, но что-то ужимать (пусть и в 2 раза за счёт байтового массива) - для меня не выход. Можно одновременно держать в памяти часть массива, это куча доп. кода для каждой простой операции, как, например, поиск в массиве. Если бы VB позволял создавать "постраничные" массивы, где первый индекс массива указывает на страницу(массив-страницу в памяти), то лучше бы я переписал код для работы с таким массивом.
                      Цитата BlackSun @
                      Можно одновременно держать в памяти часть массива, это куча доп. кода для каждой простой операции, как, например, поиск в массиве.

                      Нет. На доступе это никак не скажется, разница только при подгрузке которая ловится перехватом исключения.
                      Цитата BlackSun @
                      Если бы VB позволял создавать "постраничные" массивы, где первый индекс массива указывает на страницу(массив-страницу в памяти), то лучше бы я переписал код для работы с таким массивом.

                      Ничто не мешает создать такой.
                        Цитата TheTrik @
                        Ничто не мешает создать такой.
                        Как?
                          Цитата BlackSun @
                          Как?

                          ExpandedWrap disabled
                            Public Type struFileInfo
                                Idx As Long
                                Info As String * 124
                            End Type
                             
                            Private Type tPage
                                tData() As struFileInfo
                            End Type
                             
                            Public aFileInfo() As tPage
                            Цитата BlackSun @
                            что имеется ввиду?

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


                            За длину такого фиксированного массива можно брать, например 100 элементов. Далее, для того чтобы записать 400 000 000 элементов, тебе необходимо сгенерировать 4 000 000 массивов по 100 элементов, всё просто. Непрерывное свободное место объёмом в 100 элементов с куда бОльшей долей вероятности встретиться в ОЗУ, и, естественно, такие массивы уложить в памяти проще.

                            Это я тебе пример привёл для поведения как у массива. Если же ты будешь использовать связный список - то там вообще не надо заморачиваться, он хранится по 1 элементу в памяти. Единственный минус связных списков - невозможно получить доступ к конкретному элементу сразу, для этого надо пройтись от начала или от конца списка по всей цепочки, и найти нужный элемент. Зато, добавление новых элементов, и удаление старых - моментальное.

                            Короче, всё это - основы, я тебе уже книжки пересказываю, мог бы и сам почитать...
                            Сообщение отредактировано: VisualProg -
                              TheTrik мне нужно постраничное хранение в памяти, а не постраничное чтение из файла, хотя, экономия памяти - тоже выгода. VisualProg, да про списки-то я знаю, а вот уверены, что коллекция лежит в памяти кусками? Сейчас потестим.
                                Цитата BlackSun @
                                TheTrik мне нужно постраничное хранение в памяти, а не постраничное чтение из файла, хотя, экономия памяти - тоже выгода.

                                Файл маппинг - для больших линейных массивов данных. Если у тебя не очень большой массив, то можешь делать как тут Максимальный размер массива UDT.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


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