0

我有一个 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输出command_1,这样我就可以在不将其保存到物理磁盘文件的情况下重复使用它?

4

1 回答 1

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只需要输出的第 2 列command_1。)

于 2013-04-26T21:21:02.893 回答