我是新来的,如果我的问题已经得到回答,我很抱歉,但我已经搜索了几天,还没有找到解决方案或解释。
问题是,在变量数组的填充过程中,内存消耗不断增加。数组是定尺寸的,当它第一次定尺寸时,我可以看到内存消耗是如何相应地增加的。我认为一小段代码比文字更能解释它:
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
我对这段代码的经验是在数组标注内存cons之后。增加了约160 MB(即10*10000 000*16)。执行完成后,我有和额外增加了大约400 MB!有趣的是,如果用数字替换字符串AAAA,这个问题就消失了。
在实际的程序中(这只是一个测试代码),我有一个大约600 MB的更大数组,但在代码执行结束时,内存使用量为3.4 GB!因此出现"内存不足"错误。
有人能解释一下吗?
提前感谢,Den
您看到的情况是由于当变体包含字符串时,实际的字符串数据不会存储在内部。一个变体由16个字节组成。这里描述了这16个字节的布局。请注意,其中8个字节包含类型信息等内容,而当数据为数字时,其他8个字节则包含实际数据。当数据是字符串时,这8个字节是不够的。相反,这8个字节包含一个指向BSTR结构的指针,该结构由4个字节组成,其中包含字符串的长度、字符串中的实际字符(每个字符有2个字节)和一个2个字符的空终止符。对于长度为9的字符串,计算结果为24个字节,因此存储该字符串(以及它所指向的变体)总共需要16+24=40个字节。这就解释了为什么以这种方式存储这1000万个字符串至少需要400 MB。
正如你所看到的,变体是一个记忆猪。如果你真的需要使用ExcelVBA,你应该避免像瘟疫一样的变体数组。字符串本身的效率不是很高。也许你可以做一些事情,比如将字符的ascii代码存储为字节,或者将许多字符串组合成一个单独的字符串,在需要时可以拆分。