2015-04-04 222 views
0

對不起,我沒用catecho前期,但在上〜2GB的.gz文件運行less我看到的RAM 25GB〜得到消耗(儘管輸出被管道輸送到awk和消費存在):「less」爲gzip文件上的管道輸出消耗大量內存,爲什麼?

[[email protected]:~]$ cat <(echo '173abcde7665559.90651926 
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.5小時後(由時間是89.8%,到閱讀的.gz):

[[email protected]:~]$ 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}} 
[[email protected]:~]$ free -m 
      total  used  free  shared buffers  cached 
Mem:   24103  23985  117   0  125  3958 
-/+ buffers/cache:  19901  4201 
Swap:   8191  7914  277 
[[email protected]:~]$ 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 

我會嘗試一些其他選項(如直接用重寫我的命令或zcat)以查看這些是否有幫助,但是如果有人能夠知道爲什麼這種情況發生在少量(或任何其他命令)的情況下,無論是已知的lessbash錯誤在更高版本中修復?也許一些shell技巧強制更少的行爲正確?

P.S. stats.gz是25261745373個字節的未壓縮(5次左右MAX_INT包裹):

[[email protected]:~]$ ls -l /tmp/stats.gz 
-rw-r--r-- 1 user users 1837966346 Apr 3 21:42 /tmp/stats.gz 
[[email protected]:~]$ gzip -l /tmp/stats.gz 
     compressed  uncompressed ratio uncompressed_name 
     1837966346   3786908893 51.5% /tmp/stats 
+0

'less'旨在交互使用。它的輸出似乎在這裏被傳送到awk。爲什麼你甚至使用'less'? – Kenster 2015-04-04 18:53:58

+0

只是一種「無害」的習慣(在今天的啓示之後並非如此無害)。使用適當的低管設置 - 摘要從任何需要關心是否是gz/bz2/etc或一個原始文件(有大量的IT強制執行的例程gzipping/bzipping一切 - 背景上的舊比1d) – Vlad 2015-04-04 19:00:26

回答

4

less在存儲器中存儲的所有數據。這是允許你向上滾動的。

+0

謝謝,聽起來合理。所以'少'是不夠聰明的看到輸出進入管道(而不是tty可滾動性可能),從而丟棄內部緩衝區? – Vlad 2015-04-04 18:54:40

+1

顯然不是。可能有選項來配置這些東西,但如果您不想分頁,則不應使用分頁器。 – 2015-04-04 19:26:39

+0

好的,謝謝!時間來改變我的習慣,並使用直接工具,而不是我曾經使用,而不會注意任何開銷:) – Vlad 2015-04-04 20:12:45

相關問題