Excel VBA - 填充Variant数组会增加内存使用量

时间:2017-10-14 09:39:22

标签: arrays excel-vba memory variant vba

我是新来的,如果我的问题已经回答,请提前抱歉,但我现在正在搜索几天,但却找不到任何解决方案或解释。

问题在于,在变种阵列的数量期间,内存消耗不断增加。数组是标注尺寸的,当它是第一个尺寸时,我可以看到内存消耗如何增加相应的数量。我认为一小段代码会比文字更好地解释:

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!因此,内存不足"错误。

有人可以解释一下吗?

提前致谢, 巢穴

1 个答案:

答案 0 :(得分:3)

您所看到的是由于当变体包含字符串时,实际的字符串数据不会在内部存储。变体由16个字节组成。这16个字节的布局描述为here。请注意,其中8个字节包含类型信息等内容,另外8个包含实际数据,当数据为数字时。当数据是字符串时,那8个字节是不够的。相反,这8个字节包含一个指向BSTR结构的指针,该结构由4个字节组成,包含字符串的长度,字符串中的实际字符(每个字符2个字节)和2个字符的空终止符。对于长度为9的字符串,可以使用24个字节,因此总共有16 + 24 = 40个字节用于存储该字符串(以及它指向的变体)。这就解释了为什么在存储这些1000万字符串时至少需要400 MB才能存储它们。

正如您所看到的,变体是一种记忆力。如果你真的需要使用Excel VBA,你应该避免像瘟疫一样的变种数组。字符串本身效率不高。也许你可以做一些事情,比如将字符的ascii代码存储为字节,或者将许多字符串组合成一个字符串,可以在需要时将其拆分。