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

时间:2015-04-24 09:03:05

标签: excel vba memory dictionary

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

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

然后,对于每个"行"值(没有写入工作表),我正在进行大量的计算,我将其存储在各种数据结构中(此时我有3个主要结构)。其中一个结构由以下部分组成:

具有150k字典的变体数组。每个字典有~4个Key-Item对。每个字典中的每个项目都是另一个字典,包含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的内存。

1 个答案:

答案 0 :(得分:0)

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

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

我能够存储8个不同的3D阵列(150k乘8乘13)和7个不同的2D阵列(150k 13),两个双打。开销似乎不太高。给定每个双字节8个字节的大小,理论内存使用量为1.11GB,这不是太糟糕。