返回顶部

软件工程实践第二次个人作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标 github进一步的使用,python多进程,代码单元测试,argparse的使用
学号 051806129

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
Estimate 估计这个任务需要多少时间 30 60
Development 开发
Analysis 需求分析 (包括学习新技术) 120 360
Design Spec 生成设计文档 120 150
Design Review 设计复审 20 10
Coding Standard 代码规范 (为目前的开发制定合适的规范) 15 30
Design 具体设计 30 120
Coding 具体编码 180 240
Code Review 代码复审 60 80
Test 测试(自我测试,修改代码,提交修改) 180 360
Reporting 报告
Test Report 测试报告 10 10
Size Measurement 计算工作量 15 15
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 30
合计 810 1465

解题思路描述

拿到题目其实觉得就是一道字典处理数据题,但是在对数据的理解上花了比较多的时间,比如提取哪些字段。在看完参考程序之后大概知道了要提取哪些字段,但是当数据量增大时对数据的读写处理就是一个时间瓶颈。然后还想了很多方法hhh,比如直接把字段取出来丢进 SQL,或者 HADOOP 的 mapreduce ,但是太繁琐了。
所以任务其实可以分解为:读数据->处理数据->写有用的数据->查询数据,根据这些子任务来进行一个个的优化即可。
那么主要的解题思路就是使用多进程来处理文件,通过查阅资料可以采用 mmap 来读取文件映射到内存中加快速度,并在参考代码上做了一定程度的优化,每加一个步骤就测试一下程序运行的时间,逐步看到时间的缩短。
流程图如下:

设计实现流程

  • 步骤一
    • 因为打算在参考代码上修改(至于为什么在参考代码修改后面会提到~),所以读懂参考代码是必须的。在读参考代码的时候不难发现 __parseDict,__listOfNestedDict2ListOfDict 这两个函数的嵌套是非常耗时的二重循环,并且这两个函数存在与否对程序运行的时间影响很大,
      大概差了近3倍,所以这两个函数其实可以删掉。
  • 步骤二
    • 查阅资料后发现程序对于大型的 json 文件的读取可能会很慢,所以采用 mmap 对文件进行内存映射,这样读取文件的速度会加快。
  • 步骤三
    • 调用多进程来完成的主要任务是:读取文件并且整理好任务需要的字段然后再写到json文件中以便后面查询。

参考资料

multiprocessing
mmap
unitest
argparse

代码说明


extract_Data_From_File 和 save_Processed_JsonFile 就是进行优化的主要的函数,在__init函数中调用多进程配合 mmap 将文件做内存映射,加快文件的读取和访问。
提取完json数据后传入 save_Processed_JsonFile 这个函数,提取想要的 type 字段,写入新的json文件方便之后的访问查询。
这两个函数嵌套在参考代码中的 Data 类中,再配合 Run 类来运行。

单元测试截图和描述


经查看后,调用线程那部分被包括在 missing 中...

性能测试

  • 使用多进程和 mmap 处理 426 M 的 json 文件在我的电脑上大概需要 3.5 s 左右

  • 使用多进程和 mmap 处理 2.06 G 的 json 文件在我的电脑上大概需要 20 s 左右

  • 使用多进程和 mmap 处理 4.95 G 的 json 文件在我的电脑上大概需要 70 s 左右

  • 如果不使用多进程单纯使用 mmap 的话,处理 2.06 G 的 json 文件大概需要 40 s 左右

  • 关于性能优化
    关于最后的性能优化,既然文件读取已经做好了优化,那就剩下文件处理。我所知道的是 python 在遇到较大数据的时候,字典对于查找指定的 key 值的速度是较为缓慢的。所以下一个优化目标应该是用数或者其他更有效的数据结构来做查询。(但是时间不够了www...)

代码规范链接

https://github.com/LebronXierunfeng/2020-personal-python/blob/master/codestyle.md

总结

因为上周一直准备数学建模所以软工时间真的超级赶,所以只能在看懂参考代码的基础上魔改。其实自己一开始就打了一下(但是时间很紧),题目没有很难,就是单纯的数据处理和提取,关注点就在于如何加速加速加速。其实最后在测试的时候在自己电脑试了很多种可能,从只有 mmap ,到 mmap 嵌套多进程,数据从 20 M 到 500 M 到 5 G 不断进行测试,在相同的数据量下总是多进程 + mmap 的时间更优。
总之在很短的时间内还是学到了 github 一些基本的操作以及多进程和 mmap 的知识,因为要调用一些从未接触过的第三方库,特地读了官方文档了解用法,以及了解到了从未涉及的argparse。并且了解到了对较大数据集的处理方法,对于我打数据科学竞赛也有一定的帮助,所以自己觉得这次作业的收获很大!

posted @ 2020-09-16 22:29  King_James23  阅读(27)  评论(2编辑  收藏