如何重用stdout输出而不将其保存到物理磁盘文件

时间:2013-04-26 19:47:10

标签: ksh

我有一个for循环,如下所示:

for inf from $filelist; do
  for ((i=0; i<imax; ++i)); do
    temp=`<command_1> $inf | <command_2>`
    eval set -A array -- $temp
    ...
  done 
  ...
done

问题是,command_1有点耗时且输出有点大(900MB是最高的,具体取决于输入文件的大小)。所以,我将脚本修改为:

outf="./temp"
for inf from $filelist; do
  <command_1> $inf -o $outf
  for ((i=0; i<imax; ++i)); do
    temp=`cat $outf | <command_2>`
    eval set -A array -- $temp
    ...
  done 
  ...
done

性能有所改善,但并不是我想要的,可能是因为磁盘I / O也是性能瓶颈。

只是好奇是否有办法保存stdout的{​​{1}}输出,以便我可以重用它而不将其保存到物理磁盘文件中?

1 个答案:

答案 0 :(得分:1)

不要在嵌套循环中使用管道

根据新评论和另一个原始问题,我强烈建议使用管道处理嵌套循环中的 。 Shell管道效率很低,并且会产生大量的流程开销。

查看原始问题,这需要查看command_1command_2的贡献,看看是否可以通过其他方式解决此问题。

那说:这是原来的答案:

在shell中有两种存储数据的方式:shell变量或文件。您可能尝试将该文件存储在基于内存的文件系统中,例如Linux上的/ dev / shm或Solaris中的tmpfs。

您也可以分析command_1command_2进行优化。 command_1不需要command_2的输出中的任何内容吗?尝试在两者之间放置一个过滤器。

示例:

command_1 | awk '{ print $2 }' | command_2

(假设command_2只需要command_1输出的第2列。)