软件工程实践个人编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2020/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | 学会怎样用程序解析大量的数据,并从中提取想要获取的信息。熟练掌握GitHub与博客园的使用。 |
学号 | 031802131 |
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | 20 | 25 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 40 | 80 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 | 20 | 40 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
Design | 具体设计 | 60 | 40 |
Coding | 具体编码 | 600 | 700 |
Code Review | 代码复审 | 50 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | ||
Test Report | 测试报告 | 20 | 10 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 80 | 100 |
合计 | 1010 | 1160 |
二、解题思路描述
总体思路
拿到作业之后,我首先通读了作业的要求,在做好了GitHub部分与博客园部分的准备工作(如创建代码规范文档、做总体计划)之类的工作后,便开始着手准备编码。在正式编码之前,我大致了分析并借鉴了助教给出的示例程序的思路。首先确立了使用python编码。流程为在目录下读出json文件,解析并存入字典,再由字典转化为三个存储关键信息的json文件存起来备用。当查询时将转化的json文件解析成字典格式,供函数查询并输出。
遇到的问题及理想的解决办法
占用内存过大
对于内存过大的问题,分析后知,由于json文件转化为字典的中间过程中使用到了一直增长的列表,对此我的想法是放弃使用列表存储全部文件内容的方法。
程序执行初始化命令运行时间过长
对于初始化时间过长的问题,分析后知,程序单文件读取和对数据整体进行解析的方式耗时过多,对此我的想法是使用多进程减少耗时,并且将待解析数据单文件的在多进程中解析。
三、设计实现过程
内存消耗
对于内存,使用多进程打开文件,放弃使用单列表存储大量数据,内存有效降低,解析下载的15.5G数据时,内存消耗在500M上下。
时间性能
对于初始化时间,对各种多进程方法都有尝试,最后发现进程池pool的apply_async()方法最为适合,便采用了这种方法。但在编码及测试过程中,发现多进程并不能同时操作主进程的字典及列表,我先在网上找到了一种可以多进程操作的list_proxy方法,但由于需要改动太多的函数参数,容易造成错误,便放弃了这个方法。之后尝试了每个进程分别将自己解析的数据重新写到新的过渡json文件,再将这些文件内容整合到三个获取答案的json文件当中,有非常好的时间性能。测试15.5GB的json数据时,通过此方法,搭建6个进程的进程池,初始化的时间可以达到4min以内(在我自己的电脑上测试的)。
下面给出这个方法的流程图(以三个进程为例):
四、代码说明
创建文件夹,准备储存多进程保存的大量文件。
搭建进程池,同时有6个进程解析json文件,大大提高了时间性能。
读取函数,使用pool的apply_async方法通过这个函数读取并解析文件,每个进程每次解析一个json文件,并将解析后的内容保存到一个新的json文件里。
五、单元测试截图和描述
对初始化命令和三种查询命令做了单元测试,结果显示正常。
六、单元测试覆盖率截图和描述、性能优化
单元测试覆盖率
单元测试率达到了87%,查看覆盖率html报告后发现有19个语句miss。
性能优化
优化前内存与时间性能:内存9G+,初始化时间15min+
优化后内存与时间性能:内存500M,初始化时间<4min
七、代码规范
https://github.com/wph743/2020-personal-python/blob/master/codestyle.md
八、总结
1.在编码及测试时遇到了很多困难,大部分使用搜索引擎自己解决掉了,另外,CSDN博客真是好东西。
2.多进程写完进行测试时,才发现多进程不能操作同一列表或字典,给自己一个教训,编码前要完全掌握相关的知识。
3.因为对数据库sqlite掌握的不好,导致在优化查询信息耗时的过程中遇到了诸多困难,没有在最后一个版本使用数据库,要再深入学习一下数据库的使用。