我有一台有 2 TB RAM 的机器,我正在对一个大小为 150G 的文件运行排序命令,其中我将缓冲区大小指定为 1000G,在 google 上进行了一些研究后,我得到了这条信息“缓冲区大小越大,性能越好”。这是我运行的命令
sort -rk2 --buffer-size=1000G master_matrix_unsorted.csv > master_matrix_sorted.csv
但这需要花费很多时间,而且我不知道任务的进展情况。
您知道此操作的最佳缓冲区大小应该是多少吗?我计划使用新的缓冲区大小重新运行此任务。
答案1
您无需指定操作系统和排序实现;我猜你指的是 GNU 排序。您也没有说“很多时间”是多长时间,或者您预计需要多长时间。最重要的是,您没有提及 I/O 子系统功能,而这将是决定因素。
普通 SATA 驱动器的传输速度约为 150 MB/s。按照这个速度,您的 150 GB 文件将需要 1000 秒才能读取,大约需要 15 分钟。尝试$ time cat filename >/dev/null
看看。如果大约 15 分钟(或任何time cat
显示的时间)可以,您可能能够让 sort(1) 在大约 3 倍的时间内工作,因为输出也必须被写入。
加速的最佳选择似乎是并行,因为您的数据适合内存并且您有备用处理器。根据信息页面, --buffer-size 并不重要,因为
...此选项仅影响初始缓冲区大小。如果“sort”遇到大于 SIZE 的输入行,则缓冲区将超出 SIZE。
而快速搜索表明 GNU 使用归并排序,它适合并行化。
如果您确实想了解 GNU 排序如何确定缓冲区大小以及它使用什么算法进行并行排序,可以随时获取 coreutils 源代码和随附文档。
但如果我是你,我就不会打扰。无论你用 做什么master_matrix_unsorted.csv
, sort(1) 肯定无法胜任这项任务。
首先,有一天,CSV 文件会让你犯错,因为 CSV 语法远远超出了排序的理解范围。其次,它是最慢的方法,因为 sort(1) 被迫对整个行(长度不确定)进行排序,而不仅仅是第二列。第三,当你完成后,你会得到什么? A已排序CSV 文件。这样真的更好吗?为什么命令这么重要吗?
排序听起来像是朝着目标迈出的一步,可能包括对数据的某种计算,这种计算需要数字以二进制格式。如果是这种情况,您不妨将 CSV 文件转换为更易于处理、可计算的格式,二进制首先在 DBMS 中进行格式化。您可能会发现,对最终目标进行排序是不必要的。