假设我有一个名为 jobs.csv 的文件,我想获取 Foo 完成的前 50k 个工作
我可以这样做:
# cat jobs.csv | sort -u | head -n 50000 > /tmp/jobs.csv
# cat /tmp/jobs.csv | while read line; do Foo --job=$line; done
或者
# cat jobs.csv | sort -u | head -n 50000 | while read line; do Foo --job=$line; done
就系统的 IO /内存效率而言,能分辨出哪一个更好吗?
或者更好的是,有人能为此想出更好的解决方案吗?
答案1
我通常会选择第二种选择(一直使用管道),除非其中一个中间输出对我的其他任务有用。例如,如果在针对 50k 个作业运行 Foo 之后,您想针对相同的作业运行 Bar,那么提供管道会很有用/tmp/jobs.csv
。
一直使用管道使系统能够尽早忘记数据,因此可以更高效地利用内存。它还可以绕过 VFS 和 tmpfs 堆栈,因此 CPU 占用会略低。链的整体性能也更快,因为您无需等待一个步骤完成后再开始下一个步骤(除非特定程序需要这样做)。
顺便说一句,在您的示例中,内存的最大用户是 stage,sort
因为它需要将 的全部内容保存jobs.csv
在内存中才能对其进行排序。您可以通过改进jobs.csv
最初创建的内容来提高其效率,这样您就不再需要 了sort -u
。