【发布时间】:2018-08-14 07:07:12
【问题描述】:
我有一个脚本想要在一个非常大的文件上运行多个程序/管道。示例:
grep "ABC" file > file.filt
md5sum file > file.md5
内核会尝试将文件缓存在 RAM 中,因此如果很快再次读取它,它可能是 RAM 中的副本。但是文件很大,程序运行的速度也大不相同,所以这不太可能有效。为了尽量减少 IO 使用,我想读取一次文件。
我知道使用 tee 和 moreutils 的 pee 复制数据的 2 种方法:
<file tee >(md5sum > file.md5) | grep "ABC" > file.filt
<file pee 'md5sum > file.md5' 'grep "ABC" > file.filt'
还有其他“最佳”方式吗?哪种方法制作的副本最少? >() 或 |-ed 对哪个程序有影响吗?如果一个程序太慢,这些方法中的任何一种都会尝试在 RAM 中缓冲数据吗?它们如何扩展到许多阅读器程序?
【问题讨论】:
-
在最后两次尝试中,您缺少重定向到
file.filt,它应该是> file.filt对吗?此外,您正在阅读file一次,您的逻辑看起来还不错!正在努力改进什么?还慢吗?