如何在Visual Basic 6中修复运行时错误'7'超出内存?

时间:2019-05-14 10:03:14

标签: vb6

我正在尝试在vb6中压缩包含子文件夹和文件的文件夹。为此,我读取了每个文件,并使用Redim Preserve将其逐字节存储在字节数组中。但是,大于130MB的大文件夹会引发内存不足错误。我的PC中有8 GB的RAM,所以这应该不是问题。因此,Visual Basic 6的一些限制是我们不能再使用了超过150MB的内存?

'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 :(得分:0)

首先,VB6阵列最多只能调整为2147483483647个元素。但是,由于这也是VB6中Long的上限,因此看来这不太可能成为问题。但是,尽管可以允许将数组做得很大,但它是在32位进程中运行的,因此在整个进程中,它仍受2GB可寻址内存的限制。由于VB6运行时有一些开销,因此它会将某些内存用于其他用途,并且由于您的程序也可能会做其他事情,因此也会占用一些内存。

除此之外,在创建数组时,系统还必须找到连续内存的字节数。因此,即使有足够的可用内存(在2GB的限制内),如果碎片足够多,您仍然可以摆脱内存错误。因此,创建巨型阵列始终是一个问题。

接下来,您正在使用ReDim Preserve,它需要两倍的内存。像这样调整数组的大小时,实际上需要做的是创建另一个新大小的数组,然后将所有其他数据从旧数组中复制到新数组中。一旦完成了将所有数据复制到源数组之外,就可以删除它,但是在执行复制时,它需要同时将旧数组和新数组都保存在内存中。这意味着在最佳情况下,即使没有其他分配的内存或碎片,您可以调整大小的数组的最大内存大小也将是1GB。

最后,在您的示例中,您从未显示数组的数据类型是什么。我认为,如果它是字节数组,则应该很好(数组的内存大小仅比其元素长度略大)。但是,例如,如果它是一个字符串数组或变体数组,那么我认为每个元素至少需要4个字节,从而使数组的内存大小增加了四倍。