所以天真的我想用awk
解析50个文件,所以我做了以下
zcat dir_with_50files/* > huge_file
cat huge_file | awk '{parsing}'
当然,这很糟糕,因为它会花时间创建一个文件,然后消耗一大堆内存传递给awk
。
然后一位同事告诉我,我可以这样做。
zcat dir_with_50files/filename{0..50} | awk '{parsing}'
令我惊讶的是,如果没有内存消耗,我会得到相同的结果。
ps aux
还显示两个命令并行运行。我对发生的事情感到困惑,这个答案部分回答了我的问题。
https://stackoverflow.com/a/1072251/6719378
但是如果管道知道在一定数量的缓冲数据之后启动第二个命令,为什么我的天真方法比第二种方法消耗了更多的内存?
是因为我在单个文件上使用cat
与加载多个文件相比?
答案 0 :(得分:0)
您可以按文件
减少zcat文件的最大内存使用量例如:
for f in dir_with_50files/*
do
zcat f | awk '{parsing}' >> Result.File
done
# or
find dir_with_50files/ -exec zcat {} | awk '{parsing}' >> Result.File \;
但它取决于您的解析
sub( /foo/, "bar")
)List[$2]++
)或相关(修改)(例如:NR != FNR {...}; ! List[$2]++ {...}
)