软件工程实践个人编程作业

这个作业属于哪个课程 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掌握的不好,导致在优化查询信息耗时的过程中遇到了诸多困难,没有在最后一个版本使用数据库,要再深入学习一下数据库的使用。

posted @ 2020-09-10 23:38  Fzu_吴鹏辉  阅读(263)  评论(1编辑  收藏  举报