2012-07-30 46 views
2

可能重複:
How would you implement tail efficiently?高效實現尾-n

我的一個朋友是問怎麼他會實現tail -n。 要清楚,我們需要打印指定文件的最後一行n行。

我想使用n個字符串的數組並以循環方式覆蓋它們。 但是,如果我們給出,說一個10 GB文件,這種方法根本沒有規模。

有沒有更好的方法來做到這一點?

回答

6

內存映射文件,從末尾迭代尋找行尾n次,從那一點開始寫到文件結尾標準輸出。

您可能會通過不映射整個文件,而是映射整個文件,但只是最後一個X kb的內存(比如說幾個內存頁)並在那裏尋找而使解決方案複雜化。如果沒有足夠的線條,則內存會映射更大的區域,直到獲得所需的內容。您可以使用一些啓發式實現猜測您想要映射多少內存(比如每行1kb作爲粗略估計)。雖然我不會這麼做。

2

「這取決於」,毫無疑問。考慮到文件的大小應該是可知的,並且給定一個合理的文件操作庫,它可以「搜索」到一個非常大的文件的末尾,而不用逐字逐個遍歷每個字節或抖動虛擬內存,您可以簡單地向後掃描最後統計換行符。

當您處理的文件雖然很大,但您如何處理退化的情況,其中n與多千兆字節文件中的行數接近?將東西存儲在臨時字符串中也不會縮放。