Vb6 如何修复运行时错误';7';visual basic 6中的内存不足?

Vb6 如何修复运行时错误';7';visual basic 6中的内存不足?,vb6,Vb6,我正在尝试在vb6中压缩包含子文件夹和文件的文件夹。为此,我读取每个文件,并使用Redim Preserve将它们逐个存储在字节数组中。但是,大小大于130MB的大型文件夹会抛出内存不足错误。我的电脑中有8GB的RAM,所以这不应该是一个问题。那么,visual basic 6是否有一些限制,我们不能使用超过150MB的内存 'Length of a particular File is determined lngFileLen = FileLen(a_strFilePath) DoEven

我正在尝试在vb6中压缩包含子文件夹和文件的文件夹。为此,我读取每个文件,并使用Redim Preserve将它们逐个存储在字节数组中。但是,大小大于130MB的大型文件夹会抛出内存不足错误。我的电脑中有8GB的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)
特定文件的长度已确定 lngFileLen=FileLen(文件路径) 多芬特 如果lngfilen为0,则 m_lngPtr=m_lngPtr+lngFileLen '下一行在m_lngPtr达到150 MB左右时抛出错误 ReDim文件缓冲区(1到m_lngPtr)
首先,VB6阵列的最大大小只能调整为2147483647个元素。然而,由于这也是VB6中
Long
的上限,因此这似乎不太可能是问题所在。然而,即使允许它制作这么大的阵列,它仍在32位进程中运行,因此整个进程仍受到2GB可寻址内存的限制。由于VB6运行时有一些开销,它会将一些内存用于其他事情,而且由于您的程序可能也在做其他事情,这也会占用一些内存

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

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


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

首先,VB6数组的最大大小只能调整为2147483647个元素。然而,由于这也是VB6中
Long
的上限,因此这似乎不太可能是问题所在。然而,即使允许它制作这么大的阵列,它仍在32位进程中运行,因此整个进程仍受到2GB可寻址内存的限制。由于VB6运行时有一些开销,它会将一些内存用于其他事情,而且由于您的程序可能也在做其他事情,这也会占用一些内存

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

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


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

VB6独立于PC内存大小限制数组。(我不知道确切的限制。)你可能需要使用更小的缓冲区,或者只使用(免费的)第三方zip库。看看是否有帮助。肯定有比自己读取内容更有效的方法来创建ZIP文件吗?使用第三方库。VB6独立于PC内存大小限制阵列。(我不知道确切的限制。)你可能需要使用更小的缓冲区,或者只使用(免费的)第三方zip库。看看是否有帮助。肯定有比自己读取内容更有效的方法来创建ZIP文件吗?使用第三方库。它实际上是一个字节数组。但它仍然需要大约150MB的内存。在所有语言中,数组分配不总是需要连续内存分配吗?我很确定我可以在JAVA/C中分配超过150MB的内存,那么为什么vb6会出现这样的问题呢?@ShobhinGoyal我不知道。我唯一能想到的另一件事就是当内存被释放时。VB6使用引用计数进行自动内存管理,因此我的假设是,一旦数组的大小调整完成,运行时将立即