2012-12-07 85 views
1

如果我在bash中讀取LINE循環,從stdin讀取大量輸入效率非常低,因爲它根本沒有緩衝。Bash read LINE vs read -n LINE

將使用while read -n 4096 LINE提供允許bash更有效地執行大輸入讀取的臨時緩衝?

回答

2

號可以驗證讀取與執行一次一個:

echo foo | strace bash -c 'read -n 100 f' 

,看到單一的讀取需要4所繫統調用。但很容易完成你想要的。把多達4096個字節從標準輸入到一個變量,使用過程中替換:

bash -c 'r=$(dd bs=4096 count=1 2> /dev/null); echo "$r"' 
+1

用fork和exec替換幾個讀取:) –

+0

那些讀取限制處理劇烈,閱讀一半gig文本文件與讀取LINE是一個5分鐘的過程,並且我有一個70GB的文本文件。我會用一個大緩衝區來嘗試這種技術,例如1mb –

+1

實際上,這種開銷的絕大部分都是對簡單命令的重複評估。 Bash對於評估命令有特別高的開銷 - 特別是簡單的命令。考慮到所有涉及的步驟,這是可以理解的,但其他炮彈趨向於優化更多。任何需要執行任何內建的緊密循環都會對使用Bash重複付出巨大的代價。如果你可以使用'mapfile'離開,這是一個巨大的改進,只是由於取出循環。一般情況下複合命令的速度也要快得多(比如'((())')。 – ormaaj

1

-N(而不是-n)選項將讀取過去一個換行符。

+0

Yep'-N'很好。幾乎總是比'-n' IMO更有用。可惜它在Bash中更新穎。 – ormaaj