Linux 环境高级编程的课程作业。
大文件一次性放不进内存,所以把文件切成“块”(chunk)。每个块读到内存后,用线程池排序(std::sort),然后写入一个临时文件。这样可以利用多核 CPU 同时处理多个块,提高排序速度。
排好序的临时文件需要合并成一个完整排序文件。传统归并是两个文件一对一合并(2 路归并),轮次多,效率低。这里用 k 路归并:每次一次性合并多个文件,比如 8 个文件一起归并成一个新文件。归并的任务也可以提交给线程池并行执行。
每轮归并生成的新文件会作为下一轮的输入文件,再次进行 k 路归并。最终只剩下一个文件,这就是排序后的 .bin.sorted 文件。
这样做的优点是 CPU 多线程利用,内存不会爆掉,块与块之间可并行处理。但缺点也很明显,磁盘 I/O,尤其是写入临时文件。
sudo apt install build-essential cmake
# 若报错,https://www.yaolong.net/article/pip-externally-managed-environment/
pip install conan==2.6.0
conan profile detect
# 在项目根目录跑
conan install . -s "&:build_type=Debug" -s "build_type=Release" --build=missing
cmake --preset thread-pool-sorter-debug
cmake --build --preset thread-pool-sorter-debug
./build/Debug/snippet/ThreadPoolSorterDemo/ThreadPoolSorterDemo