我需要使用如下命令:
$ cat large.input.file | process.py > large.output.file
Run Code Online (Sandbox Code Playgroud)
问题是,因为这不会让硬盘在读取输入文件和写入输出文件之间很难跳转吗?
在执行这种管道时,有没有办法告诉 bash 使用大内存缓冲区?
操作系统会将输出缓冲到一定数量,但如果输入和输出文件都在同一个驱动器上,可能仍然会有很多头部翻转,除非你自己process.py做了一些缓冲。
您可以cat在示例中替换为管道查看器 (pv)(在大多数标准存储库中可用,如果它不在您的发行版的存储库中,则很容易编译)它允许您将其设置为缓冲更多(使用-B/--buffer-bytes选项)并显示一个进度条(除非你要求它不要),如果你process.py不输出自己的进度信息,这对于长时间的操作来说可能非常方便。要将数据从驱动器上的一个位置传递到同一驱动器上的另一个位置,这可能会产生很大的不同,除非整个过程主要受 CPU 限制而不是 I/O 限制。
因此,对于 1Mb 缓冲区,您可以执行以下操作:
pv -B 1m large.input.file | process.py > large.output.file
Run Code Online (Sandbox Code Playgroud)
我pv一直在使用这种东西,尽管主要用于进度指示器而不是可调整的缓冲区大小。
另一种选择是使用更“标准”(就默认情况下普遍可用的标准而言,其命令行格式与大多数常见命令略有不同)dd,尽管它没有进度条工具:
dd if=large.input.file bs=1048576 | process.py > large.output.file
Run Code Online (Sandbox Code Playgroud)
编辑:ps。挂件可能会指出cat您的示例中不需要它,因为以下内容也可以正常工作,并且效率会稍微提高一些:
process.py < large.input.file > large.output.file
Run Code Online (Sandbox Code Playgroud)
有些人把去除不必要的电话cat称为“去模化”,这些人可能不应该受到鼓励......
不用担心。操作系统会为你做缓冲,而且通常非常擅长。
话虽这么说:如果您可以更改 process.py,您就可以实现自己的缓冲。如果您无法更改 process.py 您可以编写自己的 buffer.py 并像这样使用它。
$ cat large.input.file | buffer.py | process.py | buffer.py > large.output.file
Run Code Online (Sandbox Code Playgroud)
从RAM 磁盘读取和写入可能要容易得多。
| 归档时间: |
|
| 查看次数: |
14995 次 |
| 最近记录: |