简体中文 | English
本程序为 2022 年夏季“数学实践”课程的课程项目(大作业),实现了一个分布式字符串排序系统。假如你想抄作业,请先向科任老师确认可以使用的技术。
展示的讲稿在 presentation.md 中。
-
对总量为 320G(字节)的数据文件集进行排序,比拼排序速度。
-
文件内为长度 15 的随机英文字母字符串,
/n
换行(参见文件样例),按字符顺序对字符串排序,同样/n
换行,输出到文件。按正确率和完成时间短长排名得分。 -
每 2 班 6 组同机房比拼,每组分实验室 8 台电脑作为资源,需排序文件会预先放入其中硬盘 E 的
data
目录下(每台机器 40G(25 亿条记录),文件名:data01.txt
-data08.txt
)。电脑预装所需要的软件(JAVA8 和 PYTHON3.7,只允许选用这两个软件)。 -
统一时间开始,各组可以操作各电脑,传入自身软件,开始排序任务。输出要求放在 D 盘根目录下新建组名目录中(如 1 班 1 组 1 号机目录为:
c1g1m1
),输出按字符串头字母分为 26 个文件,顺序放置在 8 台机器(文件名resulta.txt
-resultz.txt
,1 - 2 号机顺序放前 8 个文件,3 - 8 号机顺序放后 18 个文件),完成后截屏(包括目录名,文件名,文件大小,生成时间)拼成一张大图片(只能是 1 张图片)发至 QQ 群中,群中消息作为项目完成时间。 -
每组随机抽 2 人代表小组答辩,要对小组项目实施过程、方案及代码进行说明,并回答老师提问,由老师进行评分。
- 可以自带 JRE
- 可以调用外部库
- 曾经考虑过使用 GraalVM 将本程序编译成本地代码(同时保证代码依然是合规的 Java 8 代码),最终因没能搞懂 Gradle 上对应的插件放弃了这个想法。
- 机房电脑上装了 Oracle Java SE 8,测试时自带了 Azul Zulu 17 这个据说最快的 JRE 过去。(但还是通过
project.targetCompatibility
来保证代码兼容 Java 8)- 换新版本一开始是想试试 ZGC,但发现容易爆 OOM,最后还是用了 G1 GC。
- Java 8 写的有点难受(比如
Optional<>
没有or
),不过没有到影响任务完成的程度。
- 性能调试使用了 System Informer(当时名字还是 Process Hacker)和 VisualVM。
- 数据查看使用了 ImHex。
- 机房电脑 C 盘是 SSD,果断把缓存扔在那。
- 实际测试当天
- 机房的 IP 变了,导致一开始有相当一部分数据传丢了,后面修改命令行参数单独传输了这部分数据。
- 出现了输出文件大小明显过小的问题,第一时间没怎么在意(因为在有上述问题浪费时间的情况下依然是第一个完成的组)直接溜出去给其他组员讲要怎么念 PPT。
- 回到机房看数据的时候判断是合并过程的问题,写了一个按照文件名判断并重新合并文件的程序,最终输出文件大小比正常大小大一倍,大量出现相邻两行重复。
- 判断是合并过程中有文件删除相关的问题,想写程序直接对输出文件进行去重,但纠结于是直接两行删一行还是判断去重,最后选择了前者,但是因为硬盘速度最终没有在最终时限前跑完。
- 选择了过大的文件作为最终提交成绩的版本。