Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 字符串如何存储在VBA字典结构中?_Excel_Vba_Dictionary - Fatal编程技术网

Excel 字符串如何存储在VBA字典结构中?

Excel 字符串如何存储在VBA字典结构中?,excel,vba,dictionary,Excel,Vba,Dictionary,由于我目前正在处理大量字符串(请看另一个问题:),我使用脚本字典只是为了它具有的键控访问功能。 一切看起来都很好,只是加载字符串的速度有点慢,而且占用了大量内存。例如,对于长度为128个字符的100000个字符串,任务管理器在sub的末尾显示大约295 MB,当设置Dictionary=Nothing时,Excel中只剩下可怜的12 MB。即使考虑字符串128*2*100000的内部Unicode转换,也会得到25.6MB!有人能解释一下这个巨大的差异吗?以下是我在脚本中能找到的所有信息。字典:

由于我目前正在处理大量字符串(请看另一个问题:),我使用脚本字典只是为了它具有的键控访问功能。
一切看起来都很好,只是加载字符串的速度有点慢,而且占用了大量内存。例如,对于长度为128个字符的100000个字符串,任务管理器在sub的末尾显示大约295 MB,当设置Dictionary=Nothing时,Excel中只剩下可怜的12 MB。即使考虑字符串128*2*100000的内部Unicode转换,也会得到25.6MB!有人能解释一下这个巨大的差异吗?

以下是我在脚本中能找到的所有信息。字典:

,他编写了Scripting.Dictionary,“通用字典的实际实现是一个可扩展的哈希算法,当表太满时,它会重新哈希。”(从上下文可以清楚地看出,他指的是Scripting.Dictionary)Wikipedia非常好地介绍了相关概念。(在Eric的博客上搜索Scripting.Dictionary,他偶尔会提到)

基本上,您可以将哈希表看作内存中的一个大数组。您必须提供键(通常是字符串),而不是通过索引直接存储字符串。该键被“哈希化”,也就是说,对该键应用一组一致的算法步骤,将其压缩为0到哈希表中当前最大索引之间的数字。该数字用作将字符串存储到哈希表中的索引。由于每次对键进行散列时都会应用相同的步骤集,因此每次都会产生相同的索引,这意味着如果您是通过其键查找字符串,则无需像通常那样在数组中搜索

散列函数(将一个键转换为一个索引到表中的函数)被设计为尽可能随机,但每隔一段时间,两个键就可以压缩到同一个索引,这称为冲突。这是通过将字符串“链接”在一个链表(或者可能是一个更可搜索的结构)中来处理的。因此,假设您试图用一个键在哈希表中查找字符串。对键进行哈希运算,得到一个索引。在数组中查看该索引时,如果没有添加具有该键的字符串,则该索引可能是一个空槽,也可能是一个链表,其中包含一个或多个字符串,其键映射到数组中的该索引

浏览上述细节的全部原因是为了指出,哈希表必须大于它将存储的内容的数量,以使其高效(除了一些例外,请参阅)。在哈希表中看到的大部分开销都是数组中的空部分,它们必须存在才能使哈希表有效

此外,调整哈希表的大小是一项昂贵的操作,因为必须将所有现有字符串重新刷新到新位置,因此当哈希表的负载因子超过预定义的阈值并调整其大小时,它的大小可能会增加一倍,以避免不久再次这样做

在每个数组位置保存字符串链的结构的实现也会对开销产生很大影响


如果我还发现了其他问题,我会将其添加到这里…

使用任务管理器准确确定内存使用的详细信息是不可靠的。尽管如此,字典可以实现为某种哈希表,因此仅仅计算出您拥有多少字节的数据可能不是一个有用的比较。亲爱的罗杰,在如此大的数据量中,更多的MB是没有任何意义的。无论如何,如果我选择使用哈希表的解决方案,我会再次使用具有相同大小问题的数组,因为Unicode表示法。想象一下,这些字符串是长度大于2500个字符的较长字符串的哈希代码(SHA512)–great reply Blackhawk!我的问题已经澄清,你给了我进一步思考的食物。我会回答这个问题,以防万一。。。