我知道这已经过时了,但我想我会加入我刚刚发现的内容,希望它可以在未来对其他人有所帮助。
您可能已经知道 GNU 排序非常快。再加上许多 CPU 内核和大量 RAM,当您将一些特殊标志传递给 GNU 的排序并使其非常快时。
* 密切注意“缓冲区大小”标志。缓冲区大小是这种加速的主要原因。我以前使用过并行标志,它本身并没有那么快。
sort --parallel=32 --buffer-size=40G -u -t, -k2 -o $file.csv $file
我使用 for 循环来处理文件夹中的所有文件,并使用逗号分隔的第二个键对巨大的 csv 文件进行排序,只保留唯一值,结果如下:
for file in $(ls -p | grep -v -E "[0-4/]");
do
time sort --parallel=32 --buffer-size=40G -u -t, -k2 -o $file.sorted.csv $file;
done
real 0m36.041s
user 1m53.291s
sys 0m32.007s
real 0m52.449s
user 1m52.812s
sys 0m38.202s
real 0m50.133s
user 1m41.124s
sys 0m38.595s
real 0m41.948s
user 1m41.080s
sys 0m35.949s
real 0m47.387s
user 1m39.998s
sys 0m34.076s
输入文件为 5.5 GB,每个文件约 75,000,000 百万行。我在进行排序时看到的最大内存使用量略低于 20 GB。因此,如果它按比例缩放,那么一个 50 GB 的文件应该占用比 200 GB 少一点的空间。在 9 分钟内整理了 27.55 GB 的数据!