VBA Excel – 性能问题的大Scripting.Dictionary

我构build了一个查询内存字典的函数,以避免使用另一个函数来查询服务器上的实际数据库。 目标是查询数据库只有一次(因为查询是缓慢的),并将结果保存在内存中的召回。 我在电子表格中使用原始数据库查询函数,大约有25k个单元格,我希望用下面的这个函数来replace。

这导致了一个非常大的公共全局词典(大约25kstring键,每个键大约75个字符长),但是我发现当我运行这个函数时,性能比查询服务器上的实际数据库差。 我希望有人可以build议一些方法,使这个performance更好…

Public dataDict As New Scripting.Dictionary Public Function DB_Wrap(database As String, query As String) As Double Dim q As ServerDatabase Dim key As String Dim result As Double key = database & "|||" & query If dataDict.Exists(key) = False Then Set root = New ServerDatabase Set q = root.Open(database) result = q.total(query) dataDict.Add key, result Else result = dataDict(key) 'its when I run this that the performance isn't great. End If DB_Wrap= result End Function 

几件事情要尝试:

您正在通过key = database & "

" & query创build一个新的string, key = database & "

" & query ,你有每次传递'数据库'和'查询'的开销(虽然它们是通过引用传递,但仍然,它加起来),你每次分配内存的string。 有什么办法可以将这些存储在一个实例中,而不是每次调用函数时都创build它们? 也许你可以同时创build所有需要的string并传递它们,而不是每次都在函数中创build它们?

我会想象Set q = root.Open(database)是这里的缓慢部分,所以如果你可以在一个实例中获得所有的键,它应该有所帮助。

你能把钥匙缩短吗? 处理得越慢的字符越多。

而不是声明dataDict As New Scripting.Dictionary在你的活动代码中声明它:

 Dim dataDict As Scripting.Dictionary Set dataDict = New Scripting.Dictionary 

如果您使用New关键字声明,您的代码通常会在执行您的订单之前检查对象是否存在。

最后,数据如何从服务器转换成字典? 也许arrays会更好?