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

Excel VBA - populating Variant array increase memory usage

我是新来的,如果我的问题已经得到解答,请提前致歉,但我已经搜索了几天,但还没有找到解决方案或解释。

问题是在填充变体数组期间,内存消耗不断增加。该数组是有维度的,当它第一次被维度化时,我可以看到内存消耗是如何增加相应数量的。我认为一小段代码会比文字更好地解释它:

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!结果是 "Out of memory" 错误。

有人可以解释一下吗?

提前致谢, 登

您所看到的是由于当变体包含字符串时,实际的字符串数据并未在内部存储。变体由 16 个字节组成。这 16 个字节的布局描述为 here. Note that 8 of those bytes contain things like type information and the other 8 contain the actual data when that data is numerical. When the data is a string, those 8 bytes are not enough. Instead, those 8 bytes contains a pointer to a BSTR 结构,它由 4 个字节组成,其中包含字符串的长度、字符串中的实际字符(每个字符 2 个字节)和一个 2 个字符的空终止符。对于长度为 9 的字符串,它有 24 个字节,因此总共有 16 + 24 = 40 个字节用于存储该字符串(以及它指向的变体)。这就解释了为什么以这种方式存储这 1000 万个字符串至少需要 400 MB。

如您所见,变体非常耗费内存。如果你真的需要为此使用 Excel VBA ,你应该避免像瘟疫一样的变体数组。字符串本身不是很有效。也许你可以做一些事情,比如将字符的 ascii 码存储为字节,或者将许多字符串组合成一个字符串,需要时可以拆分。