Sorting 行的外部排序С;要合并的文件数量?

Sorting 行的外部排序С;要合并的文件数量?,sorting,mergesort,external-sorting,Sorting,Mergesort,External Sorting,我需要在PC上以最短时间(数十GB)对文件中的行进行排序。我应该使用N向合并排序,对吗?如何选择数字N(一次要合并的文件数)?我应该在读写和调谐N时测量延迟吗?或者从系统中获取磁盘信息?如果我有SSD,我可以一次合并所有排序的部分吗(程序需要以某种方式确定它是SSD)?还可以进行哪些优化?在创建一组已排序的子文件的初始过程之后,对于硬盘驱动器,通常使用使用最小堆的16路合并,这仍然足够快,可以保持进程I/O绑定。为了减少随机访问开销,需要大量的读/写操作,比如如果您有足够的ram(16个输入块,

我需要在PC上以最短时间(数十GB)对文件中的行进行排序。我应该使用N向合并排序,对吗?如何选择数字N(一次要合并的文件数)?我应该在读写和调谐N时测量延迟吗?或者从系统中获取磁盘信息?如果我有SSD,我可以一次合并所有排序的部分吗(程序需要以某种方式确定它是SSD)?还可以进行哪些优化?

在创建一组已排序的子文件的初始过程之后,对于硬盘驱动器,通常使用使用最小堆的16路合并,这仍然足够快,可以保持进程I/O绑定。为了减少随机访问开销,需要大量的读/写操作,比如如果您有足够的ram(16个输入块,1个输出块,1.7GB的缓冲空间),则需要100MB


对于传输速率更快的SSD,小于16的k路合并可能是最好的。对于读速率为2GB/S、写速率超过1GB/S的速度非常快的SAS或NVMe SSD,在保持驱动器接近I/O绑定的同时,可能只需要无堆的2路或4路合并。对于读写速率略高于500MB/S的SATA SSD,从6路到16路合并可能是最好的选择。

为什么SSD k更小?SSD具有快速随机评估功能,因此我们可以一次合并更多文件,而合并的时间更少iterations@slou_pc-问题是,如果k相对于SSD的读/写速度太大,则为每个合并的元素更新最小堆将占用k路合并的大部分时间。假设为临时文件分配了连续空间,这样,硬盘的随机访问开销就会相对较小。如果一个相当快的硬盘可以读/写100MB/S,那么读/写一个100MB的数据块需要1秒,而随机访问需要大约015秒,从而将随机访问开销降低到大约1.5%。