使用临时文件vspipe道的优点和缺点

假设我有一个名为jobs.csv的文件,我想要得到Foo完成的前5万个工作

我可以做:

# 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 /内存效率来看,哪一个更好?

或者甚至更好,可以为此提出一个更好的解决scheme?

我通常会select第二个选项(一路输出),除非其中一个中间输出对我来说是另一个任务。 例如,如果在对Foo运行5万个作业之后,然后想要针对相同的作业运行Bar,则可以使用/tmp/jobs.csv

使用pipe道可以使系统尽早忘记数据,因此可以更有效地利用内存。 它也绕过VFS和tmpfs堆栈,所以它使用less量的CPU。 链条的整体性能也更快,因为在开始下一步之前,不需要等待一个步骤完成(除非特定程序需要)。

顺便说一下,在你的例子中,最大的内存使用者将是sort阶段,因为它需要将jobs.csv的全部内容jobs.csv在内存中以进行sorting。 你可以通过改善创造jobs.csv任何东西来提高效率,这样你就不再需要sort -u