问题是这样的:由于NandFlash的特性,在某个特定的物理页在被多次读取后,和它对应的一个页上有可能会出现不可校正的ECC错误,为了减少这种问题发生的几率,考虑在驱动中加入Cache的功能,将一段时间内读次数最多的若干个页Cache起来。在Cache起来之后,以后对于这些页的读取就只是从Cache中读取,而不需要从Flash上读取数据。
在驱动中在读取页的函数中加入了计数,目前使用一个数组,数组下标代表页号,数组内容记录被读取的次数。
最开始的做法是在每隔3分钟时,循环查询这个数组,第一次将读次数最多的记录下来,第二次记录读次数第二多的,依次记录100个页。发现以目前的Flash大小(256MB,一共65535个页)需要9秒多,这个时间没法满足要求。
后来有人提示说可以用快速排序的方法来做,我就又采用快速排序的方法来做,考虑到我实际上并不关心得到的100个页必须按由高到低的次序排列,我只需要这100个页的读次数是最多即可。我又修改了一下快速排序的方法,好比按由高到低来排序,如果第一次排序之后发现左边的项已经大于10,那么就只需要在左边做递归;如果小于100,那么只需要在右边做递归,同时将这个需求值减掉左边的项的数目。这样的话应该能减少很多的计算。但是通过这个方法发现还是需要9秒多的时间。
问题就是这样,有没有什么好方法可以很快的找到100个被读取次数最多的页,而对这100个页其实并不关心是否按序排列。