我有一个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}}输出,以便我可以重用它而不将其保存到物理磁盘文件中?
答案 0 :(得分:1)
根据新评论和另一个原始问题,我强烈建议使用管道处理嵌套循环中的 。 Shell管道效率很低,并且会产生大量的流程开销。
查看原始问题,这需要查看command_1
和command_2
的贡献,看看是否可以通过其他方式解决此问题。
那说:这是原来的答案:
在shell中有两种存储数据的方式:shell变量或文件。您可能尝试将该文件存储在基于内存的文件系统中,例如Linux上的/ dev / shm或Solaris中的tmpfs。
您也可以分析command_1
和command_2
进行优化。 command_1
不需要command_2
的输出中的任何内容吗?尝试在两者之间放置一个过滤器。
示例:
command_1 | awk '{ print $2 }' | command_2
(假设command_2
只需要command_1
输出的第2列。)