ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1167|回复: 8

[求助] 字典KEY加载时间太长

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-6-14 19:24 | 显示全部楼层 |阅读模式
字典999999行数据,加载KEY耗时太长,求助大神指教是否用法不当还有更快的办法实现

字典KEY耗时.rar

15.56 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2017-6-14 20:57 | 显示全部楼层
一般说来,如果关键字超过 6w,字典的效率就会下降,超过越多,下降越厉害。

站内搜索 香川群子女侠有关字典提速的帖子看看。



TA的精华主题

TA的得分主题

发表于 2017-6-14 21:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
没有办法,字典就是这么慢,百万条的key循环写入字典,我的电脑试了也是要20多秒,字典的赋值是比数组慢很多;把“生成数据”代码中的cells(i,1)=i 改成brr(i,1)=i ,对比一下就能发现,读入数组只要0.0几秒...

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-14 23:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-6-15 09:49 | 显示全部楼层
d.q_123 发表于 2017-6-14 23:50
看来加载百万KEY是硬伤

字典嵌套,“分而治之”,能快不少。
类似香川女侠的 二分法,可惜原理我不太懂。

Sub gg()
    Dim dic, arr1, x&, s$, T As Double
    T = Timer
    Set dic = CreateObject("Scripting.Dictionary")
    arr1 = Range("A1").CurrentRegion
    Cells(2, 6) = Format(Timer - T, "0.0000s") '建立数组时间
    For x = 1 To UBound(arr1, 1)
        s = Mid(arr1(x, 1), 1, 1)
        If Not dic.exists(s) Then
            Set dic(s) = CreateObject("Scripting.Dictionary")
        End If
        dic(s)(arr1(x, 1)) = ""
    Next
    Cells(3, 6) = Format(Timer - T, "0.0000s") '添加KEY时间
    sa = dic.items ' 可查看嵌套字典的详细情况
End Sub


生成数据,用数组,可秒杀:
Sub ff()
    Dim T As Double, ar(1 To 999999, 1 To 1), i
    Application.ScreenUpdating = False
    T = Timer
    For i = 1 To 999999
        ar(i, 1) = i
    Next
    [a1].Resize(UBound(ar)) = ar
    Cells(1, 6) = Format(Timer - T, "0.0000s") '数据生成时间
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2017-6-15 10:00 | 显示全部楼层
字典KEY耗时1.rar (15.17 KB, 下载次数: 19)

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-16 16:26 | 显示全部楼层
zax010 发表于 2017-6-15 09:49
字典嵌套,“分而治之”,能快不少。
类似香川女侠的 二分法,可惜原理我不太懂。

首先谢谢ZAX010的改进代码,速度提升得不是一个档次,加载KEY速度完美,毫不留情的抄袭了,哈哈,原理也没搞明白,愿意和你分享我的体会
(受代码启发,我将百万KEY分成2个50万,建立2个字典,测得速度快一半,分的越多,速度越快,揣测其原理原因应该是多线程的原因,对我来讲,谢谢)

TA的精华主题

TA的得分主题

发表于 2017-6-16 18:01 | 显示全部楼层
这个不叫多线程哈,就是分批创建;
楼上的例子,相当于分别按照数字的首位(1到9)分别创建9个字典,这样每个字典就只有10多万的量;
之前在论坛里看过有大神说过,字典的key数量上了10W的量级之后,写入就特别慢,所以分若干组的话就快很多

TA的精华主题

TA的得分主题

发表于 2017-6-16 18:04 | 显示全部楼层
d.q_123 发表于 2017-6-16 16:26
首先谢谢ZAX010的改进代码,速度提升得不是一个档次,加载KEY速度完美,毫不留情的抄袭了,哈哈,原理也 ...

说得不错,此类问题字典嵌套多了,速度会加快。但是与线程无关,Excel就是单线程运行的。

仍建议看2楼建议,搜一下香川女侠的相关帖子,好好看一下。





您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 03:01 , Processed in 0.039194 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表