我是新来的,如果我的问题已经得到解答,请提前表示歉意,但我现在已经搜索了几天,但尚未找到解决方案或解释。
问题在于,在填充变体数组期间,内存消耗不断增加。该数组已确定尺寸,当第一次确定其尺寸时,我可以看到内存消耗如何增加相应的量。我认为一小段代码比文字更能解释它:
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!结果出现“内存不足”错误。
谁能解释一下吗?
提前致谢, 书房
最佳答案
您所看到的情况是由于当变体包含字符串时,实际的字符串数据不会存储在内部。一个变体由 16 个字节组成。这 16 个字节的布局描述为 here 。请注意,其中 8 个字节包含类型信息等内容,另外 8 个字节包含实际数据(当该数据为数字时)。当数据是字符串时,这 8 个字节是不够的。相反,这 8 个字节包含一个指向 BSTR 的指针。该结构由保存字符串长度的 4 个字节、字符串中的实际字符(每个字符 2 个字节)和 2 个字符的空终止符组成。对于长度为 9 的字符串,计算结果为 24 个字节,因此总共需要 16 + 24 = 40 个字节来存储该字符串(及其指向的变体)。这就解释了为什么以这种方式存储这 1000 万个字符串时至少需要 400 MB 的空间。
如您所见,变体非常消耗内存。如果您确实需要使用 Excel VBA 来实现此目的,则应该像避免瘟疫一样避免使用变体数组。字符串本身效率不是很高。也许您可以做一些事情,例如将字符的 ascii 代码存储为字节或将许多字符串组合成一个字符串,该字符串可以在需要时拆分。
关于arrays - Excel VBA - 填充变体数组会增加内存使用量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46743063/