byoj 项目开发日志

本文最后更新于:2023-05-17 02:32:55 UTC+08:00

项目地址:https://github.com/ligen131/byoj

总览

序号 项目 是否完成
0 外部排序 External Sort
1 用户注册
2 用户登录 (通过 JWT 鉴权与验证身份)
3 新增帖子与查询帖子列表
4 API 文档
5 Docker

文档及教程参考

外部排序

参考

外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。比如,要对900 MB的数据进行排序,但机器上只有100 MB的可用内存时,外归并排序按如下方法操作:

读入100 MB的数据至内存中,用某种常规方式(如快速排序、堆排序、归并排序等方法)在内存中完成排序。

将排序完成的数据写入磁盘。

读入每个临时文件(顺串)的前10 MB( = 100 MB / (9块 + 1))的数据放入内存中的输入缓冲区,最后的10 MB作为输出缓冲区。(实践中,将输入缓冲适当调小,而适当增大输出缓冲区能获得更好的效果。)

执行九路归并算法,将结果输出到输出缓冲区。一旦输出缓冲区满,将缓冲区中的数据写出至目标文件,清空缓冲区。一旦9个输入缓冲区中的一个变空,就从这个缓冲区关联的文件,读入下一个10M数据,除非这个文件已读完。这是“外归并排序”能在主存外完成排序的关键步骤 -- 因为“归并算法”(merge algorithm)对每一个大块只是顺序地做一轮访问(进行归并),每个大块不用完全载入主存。

Ref: https://zh.wikipedia.org/zh-cn/%E5%A4%96%E6%8E%92%E5%BA%8F

bufio 自动实现带缓冲区的文件 I/O。参考 - http://c.biancheng.net/view/4595.html - https://zhuanlan.zhihu.com/p/73690883

想了好久不知道和并发有什么关系,也许是合并的时候可以并发操作。

设文件大小 size,空间限制 limitk 路归并,则有如下基本流程:

  1. 分别读取大小为 limit 的数据块,排序并分别存下来,则数据块数量(即新的文件数量) blockNum = ceil(size / limit)
  2. 并发地取 k 块数据(不足 k 块就取剩下的),则文件 I/O 缓冲区大小 inBufferSize = floor(limit / (blockNum + ceil(blockNum / k))),对于每 k 块数据通过 channel 进行合并,输出,更新 blockNum = ceil(blockNum / k)
  3. 重复上述操作,直到 blockNum 为 1 时,最后一个文件即为排序后的结果
  4. 关闭所有文件,删除临时文件(优化:每次合并完都把上一次的文件删除)

11/13 2:30 没想到一个简单的排序细节也很多,把内部排序先搞定,有空再继续。

11/22 2:45 搞定。细节还是挺多的。

使用了锁 sync.Mutex 来保护变量不被同时改变。

Online Judge

前置

参考

梳理一下要干什么:

  1. 首先,MVC,项目结构(初定)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    oj/
    main.go
    models/
    model.go # 连接数据库,获取 model 等
    users.go
    controllers/
    users.go
    router/
    router.go # API 设计、response,调用 controllers 函数
    users.go
    middleware/
    jwt.go
    utils/
    utils.go
    logs.go
  2. routerecho 创建服务端

  3. service 处理请求 controllers 解析、校验、处理请求,执行逻辑,调用 models 中 PostgreSQL 数据库(包 grom ),实现 CURD

    ref: controller 和 service 怎么区分呢? https://cnodejs.org/topic/5d312d93b2b9222961dac21d

  4. JWT 鉴权

项目结构框架

关于数据库

杂项

JWT 鉴权与中间件

Docker


byoj 项目开发日志
https://ligen.life/2022/byoj-project-logs/
作者
ligen131
发布于
2022年11月12日
更新于
2023年5月17日
许可协议