我正在运行的脚本中内存不足(我有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的内存。
答案 0 :(得分:0)
我不确定这是否是某种错误或内存泄漏,但事实是这是一种存储数据的内存效率极低的方式。
因此,我编辑了代码,使用带有单独字典的3维数组来将数组的索引与文本字符串相关联,这很有效。
我能够存储8个不同的3D阵列(150k乘8乘13)和7个不同的2D阵列(150k 13),两个双打。开销似乎不太高。给定每个双字节8个字节的大小,理论内存使用量为1.11GB,这不是太糟糕。