Tzu*_*hay 7 unix io pipe shell-scripting
假设我有一个名为 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
Run Code Online (Sandbox Code Playgroud)
或者
# cat jobs.csv | sort -u | head -n 50000 | while read line; do Foo --job=$line; done
Run Code Online (Sandbox Code Playgroud)
在系统的 IO/内存效率方面,谁能说出哪个更好?
或者更好的是,可以为此提出更好的解决方案吗?
我通常会选择第二个选项(一路管道),除非其中一个中间输出对我完成另一项任务有用。例如,如果在针对 50k 个作业运行 Foo 后,您想针对相同的作业运行 Bar,则可用可用/tmp/jobs.csv
。
一直使用管道使系统能够尽早忘记数据,因此可以更有效地利用内存。它还绕过 VFS 和 tmpfs 堆栈,因此使用的 CPU 略少。链的整体性能也更快,因为您无需等待一个步骤完成即可开始下一步(除非特定程序需要它)。
顺便说一句,在您的示例中,内存的最大用户将是阶段sort
,因为它需要将 的全部内容保留jobs.csv
在内存中以便对其进行排序。jobs.csv
您可以通过改进最初创建的任何内容来提高效率,这样您就不再需要sort -u
.