【问题标题】:External sorting of lines. Сount of files to merge?行的外部排序。要合并的文件数量?
【发布时间】:2020-07-02 23:05:03
【问题描述】:

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

【问题讨论】:

    标签: sorting mergesort external-sorting


    【解决方案1】:

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

    对于 SSD 更快的传输速率,小于 16 k 路的合并可能是最好的。对于读取速率为 2GB/S 和写入速率超过 1GB/S 的非常快的 SAS 或 NVMe SSD,在保持驱动器接近 I/O 限制的同时,可以在没有堆的情况下进行 2 路或 4 路合并。对于读写速率略高于 500MB/S 的 SATA SSD,6 到 16 路合并可能是最好的。

    【讨论】:

    • 为什么SSD的k更小? SSD 具有快速的随机评估,因此我们可以一次合并更多文件并减少合并迭代
    • @slou_pc - 问题是如果 k 相对于 SSD 的读/写速度太大,为每个合并的元素更新最小堆最终将花费大部分时间进行 k 路合并.
    • 假设为临时文件分配了连续的空间,那么硬盘驱动器的随机访问开销变得相对较小。如果一个相当快的硬盘驱动器可以读/写 100MB/S,那么读/写一个 100MB 块需要 1 秒,而随机访问需要 ~ 015 秒,将随机访问开销降低到约 1.5%。跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多