首頁 >後端開發 >C++ >如何有效地從非常大的文字檔案中檢索最後 10 行?

如何有效地從非常大的文字檔案中檢索最後 10 行?

Barbara Streisand
Barbara Streisand原創
2024-12-29 10:20:11255瀏覽

How Can I Efficiently Retrieve the Last 10 Lines from a Very Large Text File?

從海量文字檔案中高效檢索最後 10 行

確定從超大文字中提取最後 10 行的最有效方法檔案(超過10GB)需要一種最小化計算的策略

利用文件定位和反向查找

推薦的方法是使用Seek() 方法導航到文件末尾,並在文件中逐漸向後移動。檔案直到遇到 10 個換行符。透過維護行計數,該方法可以識別向前讀取並檢索所需行的精確起點。此策略可以有效地處理具有不同行數的文件,包括少於 10 行的文件。

C# 中的實作範例

以下 C# 程式碼示範了上述方法,概括為定位檔案中透過編碼編碼並用分隔符號分隔的最後一個 numberOfTokens tokenSeparator:

public static string ReadEndTokens(string path, Int64 numberOfTokens, Encoding encoding, string tokenSeparator) {
    int sizeOfChar = encoding.GetByteCount("\n");
    byte[] buffer = encoding.GetBytes(tokenSeparator);
    
    using (FileStream fs = new FileStream(path, FileMode.Open)) {
        Int64 tokenCount = 0;
        Int64 endPosition = fs.Length / sizeOfChar;

        for (Int64 position = sizeOfChar; position < endPosition; position += sizeOfChar) {
            fs.Seek(-position, SeekOrigin.End);
            fs.Read(buffer, 0, buffer.Length);

            if (encoding.GetString(buffer) == tokenSeparator) {
                tokenCount++;
                if (tokenCount == numberOfTokens) {
                    byte[] returnBuffer = new byte[fs.Length - fs.Position];
                    fs.Read(returnBuffer, 0, returnBuffer.Length);
                    return encoding.GetString(returnBuffer);
                }
            }
        }

        // handle case where number of tokens in file is less than numberOfTokens
        fs.Seek(0, SeekOrigin.Begin);
        buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        return encoding.GetString(buffer);
    }
}

透過利用此技術,可以以最小的記憶體使用量和計算複雜性從大型文字檔案中檢索最後10 行,為這種常見的檔案處理場景提供了有效的解決方案。

以上是如何有效地從非常大的文字檔案中檢索最後 10 行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn