我是新来的,如果我的问题已经回答,请提前抱歉,但我现在正在搜索几天,但却找不到任何解决方案或解释。
问题在于,在变种阵列的数量期间,内存消耗不断增加。数组是标注尺寸的,当它是第一个尺寸时,我可以看到内存消耗如何增加相应的数量。我认为一小段代码会比文字更好地解释:
Sub test()
Dim Arr(1 To 1000000, 1 To 10) As Variant
Dim i As Long, j As Integer
For i = 1 To 1000000
For j = 1 To 10
Arr(i, j) = "AAAAAAAAA"
Next j
Next i
End Sub
我对此代码的体验是 - 在数组维度内存缺点之后。大约增加160 MB(10 * 1 000 000 * 16)。执行完成后,我有额外增加大约400 MB!有趣的是 - 如果用数字替换字符串AAAA,这个问题就会消失。
在实际程序中(这只是一个测试代码)我有一个更大的数组。 600 MB,但在代码执行结束时内存使用量为3.4 GB!因此,内存不足"错误。
有人可以解释一下吗?
提前致谢, 巢穴
答案 0 :(得分:3)
您所看到的是由于当变体包含字符串时,实际的字符串数据不会在内部存储。变体由16个字节组成。这16个字节的布局描述为here。请注意,其中8个字节包含类型信息等内容,另外8个包含实际数据,当数据为数字时。当数据是字符串时,那8个字节是不够的。相反,这8个字节包含一个指向BSTR结构的指针,该结构由4个字节组成,包含字符串的长度,字符串中的实际字符(每个字符2个字节)和2个字符的空终止符。对于长度为9的字符串,可以使用24个字节,因此总共有16 + 24 = 40个字节用于存储该字符串(以及它指向的变体)。这就解释了为什么在存储这些1000万字符串时至少需要400 MB才能存储它们。
正如您所看到的,变体是一种记忆力。如果你真的需要使用Excel VBA,你应该避免像瘟疫一样的变种数组。字符串本身效率不高。也许你可以做一些事情,比如将字符的ascii代码存储为字节,或者将许多字符串组合成一个字符串,可以在需要时将其拆分。