内存泄漏 VBA - 带有字典字典的数组

Memory Leak VBA - Arrays with Dictionaries of Dictionaries

我 运行 在我 运行 的脚本中内存不足(我有 16GB)。这是一个小背景:

我正在生成一个大约 150k 行 x 8 列的数组作为我计算的基础。

然后,对于每个 "row" 的值(没有任何内容写入工作表),我进行了大量计算,并将其存储在各种数据结构中(我有 3 个主要结构观点)。这些结构之一由以下组成:

具有 150k 字典的变体数组。每个词典都有约 4 个键项对。每个字典中的每个项目都是另一个字典,正好包含 9 个键项对。所有键都是字符串,所有项目都是双打。

本质上,这与以下内容相同:

Dim Array(1 to 150000, 1 to 4, 1 to 9) as Double

除非我希望能够使用文本字符串引用这些值——因此使用字典。

一个例子是

Value = Array(2401)("Key1")("Key2")

我认为这对 VBA 来说不会太多——我们说的是 150,000 * 4 * 9 个单独的双打 = 3 个主要数据结构中的每一个的 5.4M 双打。我在编程和内存管理方面没有太多经验,但肯定不会消耗 16GB 内存!

因此,我认为我生成这些数据结构的方式存在问题,导致某处发生内存泄漏。

基本上循环看起来像这样

Dim TempDict1 as Dictionary
Dim TempDict2 as Dictionary
Dim FinalArray() as Variant
ReDim FinalArray(1 to 150000) as Variant
Dim Calculations as Double

For i = 1 to 150000
    Set TempDict = NewDictionary
    for j = 1 to 5
        Set TempDict2 = NewDictionary
        for k = 1 to 9
            Calculations = 2*2
            TempDict2.Add Key:= KeyK, Item:= Calculations
        Next k
        TempDict.Add Key:= KeyJ, Item:= TempDict2
        ' TempDict2.RemoveAll (This causes an error)
    next j
    Set FinalArray(i) = TempDict
    ' TempDict.RemoveAll (This causes an error)
Next i

我在这里做错了什么?我尝试在将临时词典添加到父项后销毁它们,但这实际上给了我一个类型错误。

更新:我试过将临时词典设置为空,而不是全部删除。这不会导致任何错误,但它仍然会消耗大量内存。迭代 37k 次,消耗 8.4GB 内存。

我不确定这是某种错误还是内存泄漏,但事实是这是一种内存效率极低的数据存储方式。

因此,我编辑了代码,使用带有单独字典的 3 维数组将数组的索引与文本字符串相关联,效果很好。

我能够存储 8 个不同的 3D 数组(150k x 8 x 13)和 7 个不同的 2D 数组(150k 13),都是双数组。开销似乎并不太高。给定每个双精度 8 字节的大小,理论内存使用量为 1.11GB,这还算不错。