arrays - Excel VBA - 填充变体数组会增加内存使用量

标签 arrays excel 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!结果出现“内存不足”错误。

谁能解释一下吗?

提前致谢, 书房

最佳答案

您所看到的情况是由于当变体包含字符串时,实际的字符串数据不会存储在内部。一个变体由 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/

相关文章:

python - Excel 等效于在 Python pandas 中使用的数组

javascript - 如何在javascript中保持插入顺序?

excel - 获取第二个工作表中列值等于行/列值的单元格值

Python 和 Pandas - 使用相同的中断删除多个文件中的页脚

c++ - vector 数组是完全连续的内存吗?

php - 为什么这个简单的 php 脚本会泄漏内存?

c - 动态内存使用情况,C 中的列表

javascript - 使用 Array.map (TypeScript) 返回通用数组

ruby - 在Ruby中查找数组中两个数字的每个组合的总和

excel - 如何在 Microsoft Excel 中获取两个日期之间的分钟差?