具体代码在:这里(求打星!!)
Lab5中的3.2中要求我们用不同的I/O策略读取大文件,并且记录读取大文件所花费的时间。这里的“大文件”,以SocialNetworkCircle_Most.txt为例,其中有近90w行数据,大小近30M。
在仅仅修改了I/O的情况下,利用Lab4原有的代码读取此文件,本人足足花费了近3个小时!!!说明原程序的时间性能实在是太差!因此分析原程序代码寻找找出程序性能瓶颈的代码。
最终经本人寻找,是此处代码:
为了保证SocialTie中的人在Friend或CentralUser中出现过,每次添加相应关系前都需要判断该人是否在Friend中出现过,原代码是通过一个循环遍历所有已添加的Friend进行比对。
每一次添加一个关系,都要遍历一遍已有数据(O(n)),最后导致时间复杂度为O(n^2),这种方法在数据量较小时没有关系,但在近90w行的数据中,所花费的时间是极其恐怖的。
那么,有没有什么更高效的比对方法,来减少这一步所花费的时间,从而降低程序读文件的总体时间呢?
这就让我联想到了键值对查询的方法,键值对查询方法的速率要远远优于循环遍历查询。因此,借用java中的Map接口,我改进了原代码,将循环比对转成了键值对查询经过此番改进后,程序性能大大提升,读文件所花费的时间由原来的3h降低到了20min左右。
总结:
在今后需要进行查询比对的程序中,可以使用Map接口代替列表遍历查询,能大大提高程序的性能!!!