【发布时间】:2015-11-30 14:45:10
【问题描述】:
我正在使用 1000 万的哈希大小...
hash={'Aatater'=>2, 'Bbabber'=>3, 'Xaazerx'=>2, 'Caackersc'=>1}
搜索密钥的速度非常快。即使密钥存在于哈希的末尾...
hash['Caackersc']=>1
但是如果你搜索一个存在于哈希深处的值,它会非常缓慢。
hash.key(1)=>"Caackersc"
所以。我第一次尝试在寻找价值时实现高速。我想我会反转哈希。但这会导致重复值被删除。
hash.invert{ 2=>'Xaazerx', 3=>'Bbabber', 1=>'Caackersc'}
然后我尝试在不丢失数据的情况下自己反转哈希...通过在每个新键之前发出索引号。
I_hash=Hash.new
hash.to_a.each_with_index{|h,i| i_hash[[i.to_s,h[1].to_s]]=h[0]}
{["0","2"]=>'Aatater', ["1","3"]=>'Bbabber', ["2","2"]=>' Xaazerx', ["3","1"]=>'Caackersc'}
所以。至此,我可以用同样的速度来搜索新的密钥了。
i_hash[["1","3"]] => "Bbabber"
但是现在...我希望可以使用正则表达式找到键的索引部分?
I_hash[/\d/,"3"]=>fail, nil
所以...这是我加快值搜索速度的最佳尝试,但只有当我可以正则表达式键的第一个数组时,它才会在我的情况下起作用。
【问题讨论】:
-
你为什么要处理一千万大小的哈希?你为什么不使用数据库?
-
如果 OP 不需要长期持久化,并且满足他们的性能需求,我不认为使用哈希是疯狂的。
-
我试过dbm。我相信搜索密钥对于这个应用程序来说有点慢......我可能需要重新测试......我没有超过 ram 所以它没有必要
标签: ruby