poi解析Excel(二) SAX解决内存问题
由于Excel的数据是通过xml来描述,所以解析Excel也就是解析xml。对于文本文件,可以通过换行符来确定一行的结束。而对于xml,其描述数据的单位是节点,并且可以嵌套,因此读取时是以节点结束来进行确定,但是除非事先知道xml的节点规则,即节点相互之间的嵌套结构,否则无法正确读取。这个xml规则就定义在Excel的规范中,poi也是基于这个规则来对Excel进行解析的
由于Excel的数据是通过xml来描述,所以解析Excel也就是解析xml。对于文本文件,可以通过换行符来确定一行的结束。而对于xml,其描述数据的单位是节点,并且可以嵌套,因此读取时是以节点结束来进行确定,但是除非事先知道xml的节点规则,即节点相互之间的嵌套结构,否则无法正确读取。这个xml规则就定义在Excel的规范中,poi也是基于这个规则来对Excel进行解析的
读取文本时通常会使用BufferedReader
,它在InputStreamReader
的基础上进行装饰,提供了readLine()
来简化文本行的读取。使得行数据的读取可以像流水线一样,每当读取完一行后,它就自动准备好下一行并等待获取,直至全部读取结束。所以这里也希望能够在poi的基础上提供一个类似readLine()
的接口来读取Excel,并可以比较方便地获取行数据中的字段。
这里考虑一个具体问题:有大约40万个数字(数字范围:0~200000000000000),数字没有重复,求这些数字中,最大的100个数字之和
在有些场景中,并不一定要求所有元素有序,而只需知道其中最大或最小的 K 个元素,比如在优先级队列中,只要每次都能获取到队列中最大或最小的的元素即可,于是有人想到了利用树的形式来组织数据,这里称为堆。
排序即将一组对象按照某种逻辑顺序重新排列的过程,通常,整理数据的第一步就是进行排序,因此它是后面很多其它算法和数据结构的基础。在计算机早期年代,据说大约有30%的计算周期都花在了排序操作上,如今这个比例有所降低,并非排序的重要性降低了,而是前辈们不懈的研究,使得如今的排序算法更加高效。
在不同的场景下选择合适的排序算法其实是很重要的,比如下面是使用文中的几种排序策略对同样的1000个随机数进行排序的结果,可以看出来差距还是比较大的
1 | SELECT comp=511566 swap=251579 cost=16355ms |
B+树又在B树基础上做了一些改进,主要是在树叶节点上添加了一个链表结构,这样可以很好的解决范围查询问题。具体做法是将所有数据节点放在最下一层树叶节点上, 所有的树叶自左向右为一个链表,而对于任意非树叶节点,不保存数据,只充当索引,这样节点可以保存更多的关键字,从而使树的高度更低,其实如果去掉最下一层树叶节点的话,它就是一颗B树。