Как исправить ошибку времени выполнения «7» Недостаточно памяти в Visual Basic 6? - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь сжать папку с подпапками и файлами в vb6. Для этого я читаю каждый файл и сохраняю их один за другим в байтовом массиве, используя Redim Preserve. Но большие папки, размер которых превышает 130 МБ, выдают ошибку «Недостаточно памяти». У меня 8 ГБ ОЗУ на моем ПК, так что это не должно быть проблемой. Итак, это некоторое ограничение Visual Basic 6, которое мы не можем использовать больше чем 150 МБ памяти?

'Length of a particular File is determined
lngFileLen = FileLen(a_strFilePath)

DoEvents
If lngFileLen <> 0 Then
    m_lngPtr = m_lngPtr + lngFileLen

    'Next line Throws error once m_lngPtr reaches around 150 MB
    ReDim Preserve arrFileBuffer(1 To m_lngPtr)

1 Ответ

0 голосов
/ 14 мая 2019

Прежде всего, размер массива VB6 можно изменить только до максимум 2 147 483 647 элементов.Однако, поскольку это также верхний предел Long в VB6, кажется, что это вряд ли проблема.Тем не менее, даже несмотря на то, что может быть разрешено сделать массив таким большим, он работает в 32-разрядном процессе, поэтому он все еще ограничен 2 ГБ адресуемой памяти для всего процесса.Поскольку во время выполнения VB6 есть некоторые накладные расходы, он использует часть этой памяти для других целей, и, поскольку ваша программа, вероятно, выполняет и другие задачи, она также будет использовать некоторое количество памяти.

В дополнение к этому, при создании массива система должна найти это число байтов непрерывной памяти.Таким образом, даже при наличии достаточного объема памяти, в пределах 2 ГБ, если он достаточно фрагментирован, вы все равно можете получить ошибки памяти.По этой причине создание гигантских массивов всегда является проблемой.

Далее вы используете ReDim Preserve, для которого требуется вдвое больше памяти.Когда вы изменяете размер массива таким образом, то на самом деле под капотом он создает второй массив нового размера, а затем копирует все остальные данные из старого массива в новый.Как только он закончит копирование всех данных из исходного массива, он может затем удалить его, но пока он выполняет копирование, ему необходимо одновременно хранить и старый массив, и новый массив в памяти.Это означает, что в лучшем случае, даже если бы не было другой выделенной памяти или фрагментации, максимальный размер памяти массива, который вы могли бы изменить, был бы 1 ГБ.

Наконец, в вашем примере вы никогда не показываликакой тип данных массива был.Я думаю, что если это массив байтов, вы должны быть хороши (где объем памяти массива будет лишь немного больше, чем его длина в элементах).Однако, если, например, это массив строк или вариантов, то я полагаю, что для этого потребуется минимум 4 байта на элемент, что увеличит объем памяти массива более чем в четыре раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...