linux 管道 压缩,linux - “较少”会消耗大量RAM用于压缩文件上的管道输出,为什么? - 堆栈内存溢出...

对不起,我无用的cat和echo在前,但在〜2GB .gz文件上运行less ,我却看到〜25GB的RAM被消耗了(尽管输出通过管道传送到awk并在那里消耗):

[user@mybox:~]$ cat

131abcde7298936.49040546

... (25 lines total here) ...

186abcde4858463.43044639

163abcde9409643.80726489'|awk '{print "KEY 1"length($1)-16":"$1}';

less /tmp/stats.gz)|awk '{if("KEY"==$1){K[$2]=1}else{if($8 in K)print}}' >bad25&

我期望上面不需要任何RAM就可以完成,但是令我惊讶的是,它在〜2.5h之后看起来是什么样子(当时读取.gz的时间是89.8%):

[user@mybox:~]$ ps auxf|grep -e 'pts/2' -e PID |grep -v grep

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

user 26896 0.0 0.0 68356 1580 pts/2 Ss+ 15:23 0:00 \_ /bin/bash

user 27927 0.7 0.0 58932 476 pts/2 S 15:23 1:00 \_ cat /dev/fd/63

user 27929 0.0 0.0 68356 716 pts/2 S+ 15:23 0:00 | \_ /bin/bash

user 27932 99.9 75.0 22389852 18512388 pts/2 R+ 15:23 137:42 | \_ less /tmp/stats.gz

user 27933 0.0 0.0 65928 1168 pts/2 S+ 15:23 0:00 | \_ /bin/sh - /usr/bin/lesspipe.sh /tmp/stats.gz

user 27934 1.3 0.0 4176 492 pts/2 S+ 15:23 1:52 | \_ gzip -dc -- /tmp/stats.gz

user 27928 2.1 0.0 63908 776 pts/2 S 15:23 2:56 \_ awk {if("KEY"==$1){K[$2]=1}else{if($8 in K)print}}

[user@mybox:~]$ free -m

total used free shared buffers cached

Mem: 24103 23985 117 0 125 3958

-/+ buffers/cache: 19901 4201

Swap: 8191 7914 277

[user@mybox:~]$ echo 1|awk "{print `cat /proc/27934/fdinfo/3|sed -n 's/pos:[ \t]*//p'`/`du -b /tmp/stats.gz|sed 's/[ \t].*//'`}";date

0.898284

Sat Apr 4 17:41:24 GMT 2015

我将尝试其他一些选项(例如,使用直接gzip -dc或zcat重写我的命令)是否有帮助,但是如果有人可以通过较少的(或任何其他命令)知道为什么会发生这种情况,那么这是否是已知less或在更高版本中修复了bash错误? 也许有一些外壳技巧可以减少强制行为,使其正常运行?

PS stats.gz为25261745373字节未压缩(围绕MAX_INT包裹了5次):

[user@mybox:~]$ ls -l /tmp/stats.gz

-rw-r--r-- 1 user users 1837966346 Apr 3 21:42 /tmp/stats.gz

[user@mybox:~]$ gzip -l /tmp/stats.gz

compressed uncompressed ratio uncompressed_name

1837966346 3786908893 51.5% /tmp/stats

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值