二、优化数据类型及算法
越到后面内存的降低越来越困难。仔细看了代码之后,除了上面之外,代码中也有一些其他问题,比如,一开始就将大量的对象实例化到内存中,然后一直保存。每一条记录中的信息比较多,但真正有用的用于搜索匹配的只有下面四个字段,但是整体的实例化会将其他没有用的字段也一并序列化进去了。导致很多内存被无用的字段占用。
股票代码 股票中文名 中文拼音 市场类型 ……
600000 浦发银行 PFYH 上证A股 ……
所以第一步就是在内存中只存放需要检索的上面四个关键字段,每一条记录刚开始是使用string[]数据,而不是使用类或者其它结构来保存,也尝试使用结构提来保存,但是由于四个字段,数据量大,中间还要作为参数传递,所以比使用类还大,这里只是简单的使用了数组。
除了上面这些之外,为了提高搜索效率,对数据按照0-9,a-z开头对数据做了切分分块缓存,这样当用户输入0时,直接从以0为key的块中读取数据,这样速度是加快了,但是大量的缓存也增加了对内存的消耗。缓存的数据基本上和加载到内存中原始的数据一样大了。并且在搜索的过程中,也是采用的完全搜索,对于17万条数据的四个字段,每一次查询要进行170000*4次遍历比较,才能找出最匹配的10条数据来。
为此,引入了不完全搜索,就是事先对各类型证券,如 股票,基金,债券分类,对每一类按证券代码进行排序。当用户设置了搜索的优先级时,依次在每一类中查找,如果找到满足条件的10条记录,则立即返回,因为数据已经事先按照证券类型和代码排好序了,所以后面找到的肯定没有之前找到的匹配度高,这一改进直接提高了搜索查询的效率。对有序的数据进行查找效率一般会比无序的数据查找效率高。我们常见的一些查找算法,比如说,二分查找法,前提也是待查找的集合有序排列。