繁体   English   中英

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! 结果是“内存不足”错误。

任何人都可以解释一下吗?

提前致谢,登

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM