软件构造Lab_5 读取大文本文件的处理与优化
注:这篇博客是解决软件构造Lab_5中对人际关系轨道系统对于大文件处理速度太慢这个问题。
一、问题概述
这个实验的一部分任务就是读取一个大文本文件,之后建立椭圆轨道系统。这个大文本文件的大小差不多是90万行数据。原来提供构造轨道系统的最大文件差不多是10万行。(PS:这个文件我在上一个实验中使用未优化的代码测试了一下30分钟没有跑完)
所以任务就是将大文件的读取和建立轨道系统的时间保持在可以接受的时间范围之内。
二、开始优化
1. 工具
了解问题之后就要开始优化了,首先我们需要一个合适的工具。
在刚开始是不知道怎么方便的记录在哪里花费的时间长短,我先是使用了一个最容易想到的办法。增加输出语句进行观察,就像这样。
System.out.print(numberOfLine); //查看文件读取行数
System.out.println(Duration.between(inst1, inst2).toMillis()); //使用inst1和inst2的时间差来查看花费的时间
首先这样有点蠢(虽然简单),其次这样不好用。在处理的过程中,难免遇到很多循环,如果将这样的语句放在循环内,将会在控制台打印出太多语句,难以观察,如果放在循环之外,有难以得知循环内部的信息,实在是下下之策。
所以,工欲善其事必先利其器。我们不使用这种方法,我们使用一个Visual VM的工具来帮我们寻找程序在那些位置执行花费了较长的时间。
2. 开始优化
在刚开始测试之前我一直以为是我的计算人们之间的逻辑距离是最耗费时间的其他没有太大的问题。事实上到最后优化完成我发现我的代码其实很多地方的时间复杂度相当的糟糕。
首先简单的介绍我原来的代码:1.将文件按行读入并进行处理。2.由读入的人际关系建立人际关系图。3.由人际关系图计算每个人的实际半径(逻辑距离)。4.将正确半径的人放入轨道系统中。
第一个优化点——时间复杂度
开始运行,发现好像只能完成第一步(???心里凉了一半,我还以为问题在第三步,谁知道第二步就解决不了)。使用Visual VM看看哪个地方问题最大。步骤2中使用的add(向图中增加顶点)函数和set函数(向图中增加边)都花费了不少的时间。但是