如何修复运行时错误'7' Visual Basic 6 中的内存不足?



我正在尝试将带有子文件夹和文件中的文件夹在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)

首先,VB6数组只能调整最大2,147,483,647个元素。但是,由于这也是VB6中Long的上限,因此似乎不太可能是问题所在。但是,即使它可以使数组如此大,它仍在32位过程中运行,因此对于整个过程,它仍然受到2GB可寻址内存的限制。由于VB6运行时有一些开销,因此它将其中的一些内存用于其他事情,并且由于您的程序也可能正在做其他事情,因此也将使用一些内存。

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

接下来,您使用的是ReDim Preserve,这需要两倍的内存。当您调整这样的数组大小时,它实际上必须在引擎盖下要做的是创建新尺寸的第二个数组,然后将所有其他数据从旧数组中复制到新数组中。一旦将所有数据复制到源数组中,就可以删除它,但是当它执行副本时,它需要同时将旧数组和新数组同时保存在内存中。这意味着,在最佳情况下,即使没有其他分配的内存或碎片,您可以调整大小的数组的最大内存大小也是1GB。

最后,在您的示例中,您从未显示该数组的数据类型。如果它是一个字节数组,我认为您应该很好(我认为(数组的内存大小只会比元素中的长度略高(。但是,例如,如果它是一系列字符串或变体,那么我相信这将需要每个元素至少4个字节,从而比Qualuplupluplupluplupluplupluplupluplupluplupluplupluple。>

最新更新