如何将string存储在VBA字典结构中?

由于我目前正在玩大量的string(看看另一个问题: arrays和Arraylist的VBA内存大小 ),我使用了一个脚本字典只是为了它的键控访问function。 一切都看起来很好,除了这是一些加载string有多慢,它使用了大量的内存。 对于长度为128个字符的100,000个string的示例,任务pipe理器在子结束时显示约295MB,并且当设置Dictionary = Nothing时,在Excel中剩余12MB。 即使考虑内部Unicode转换string128 * 2 * 100,000给25.6 MB! 有人能解释这个巨大的差异吗?

以下是关于Scripting.Dictionaryfind的所有信息:

根据编写Scripting.Dictionary的Eric Lippert的说法 ,“通用字典的实际实现是一种可扩展的哈希链接algorithm,当表格变得太满时,会重新哈希。 (从上下文中可以清楚地看出,他指的是Scripting.Dictionary)维基百科关于哈希表的文章是介绍相关概念的一个很好的介绍。 ( 这里是searchEric的博客Scripting.Dictionary,他偶尔会提到它)

基本上,你可以把一个哈希表看作是内存中的一个大数组。 不要直接通过索引存储string,而必须提供一个键(通常是一个string)。 密钥得到“散列”,也就是说,将一组一致的algorithm步骤应用于密钥,以将其压缩到哈希表中的0到当前最大索引之间的数字。 这个数字被用作索引来存储你的string到哈希表中。 由于每次密钥被散列时都会应用相同的步骤,所以每次都会得到相同的索引,这意味着如果您正在按键查找string,则不需要按照通常的方式search数组。

散列函数(这是将键转换为表中的索引)被devise为尽可能随机,但每隔一段时间,两个键可以紧缩到相同的索引 – 这被称为冲突。 这是通过在链表中链接在一起来处理的(或者可能是更可search的结构)。 所以假设你试图用一个键在哈希表中查找一个string。 密钥被哈希,你得到一个索引。 查看该索引处的数组,如果没有添加具有该键的string,它可能是一个空槽,也可能是链接列表,其中包含一个或多个键映射到数组中索引的string。

上述细节的全部理由是指出一个哈希表必须大于它将存储的数量以使其有效(除了一些例外,参见完美哈希函数 )。 你在哈希表中看到的很多开销都是数组的空白部分,为了使哈希表高效,必须在那里。

此外,调整哈希表的大小是一个昂贵的操作,因为所有现有的string都必须重新映射到新的位置,所以当哈希表的负载因子超过预定义的阈值并被resize时,可能会得到两倍的大小以避免不得不再次这样做。

在每个arrays位置持有string链的结构的实现也会对开销产生很大的影响。

如果我find其他东西,我会在这里添加它…