我需要在PC上以最短的时间(数十GB(对文件中的行进行排序。我应该使用 N 路合并排序,对吧?如何选择数字N(一次要合并的文件数(?我应该测量读取或写入时的延迟并调整 N 吗?还是从系统获取磁盘信息?如果我有SSD,我可以一次合并所有排序的部分(程序需要以某种方式确定它是SSD吗(?还有哪些其他优化功能?
在初始传递创建一组排序的子文件之后,对于硬盘驱动器,通常使用最小堆的 16 路合并,这仍然足够快以保持进程 I/O 绑定。为了减少随机访问开销,需要大量的读/写,例如 100MB,如果您有足够的 ram(16 个输入块、1 个输出块、1.7GB 缓冲区空间(。
对于传输速率更快的 SSD,小于 16 k 路的合并可能是最好的。对于读取速率为 2GB/S 且写入速率超过 1GB/S 的非常快的 SAS 或 NVMe SSD,在保持驱动器接近 I/O 限制的同时,可能只需进行无堆的 2 或 4 路合并。对于读写速率略高于 500MB/S 的 SATA SSD,6 到 16 路合并可能是最好的。