java中的Map在提供方便实用的同时,也存在内存浪费巨大的问题。当Map中的Entry数量达到1000万 条以上的时候,需要数G的内存空间 .这里提到的Map使用形式为HashMap<String,Byte>,平均每个key在20个字符左右,最多不超过200字符.
在实际情况下,有差不多5/6的内存浪费 在存放实际数据无关的地方.在一些一次写入多次读去的地方,完全没有必要浪费这么多的资源,下面就通过一个简单的实现说明。
算法说明:
按照key的长度信息将所有的entry放进不同的队列中,为了方便此时的entry队列已经排好序,当然也可以加进内存后再排序.
现在有很多的队列了,在查询的时候根据查询词长度选择一个队列,在队列中通过2分法查找.
算法适用性:
适用于key值集中在一定范围,value为简单类型(byte、int、long、float、double等),数据量在百万条以上,内存匮乏的情况.
测试结果:
测试数据为7138595条Entry,分布在250个队列中.
HashMap<String,Byte>的结果:
时间: 3780、3814
内存: 892M
此方法的结果:
时间:5792、5758
内存: 158M