Heim >Backend-Entwicklung >C++ >Wie kann ich die letzten 10 Zeilen einer riesigen Textdatei effizient abrufen?

Wie kann ich die letzten 10 Zeilen einer riesigen Textdatei effizient abrufen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-05 10:23:41443Durchsuche

How Can I Efficiently Retrieve the Last 10 Lines of a Gigantic Text File?

Effizientes Abrufen der letzten 10 Zeilen einer riesigen Textdatei

Im Bereich der umfangreichen Textverarbeitung stellt das Abrufen der letzten Zeilen einer außergewöhnlich großen Datei eine Herausforderung dar einzigartige Herausforderung. Eine solche Datei mit einer Größe von mehr als 10 GB stellt eine erhebliche Hürde bei der effizienten Beschaffung dieser Daten dar.

Um dieses Problem zu lösen, besteht ein effektiver Ansatz darin, die Datei rückwärts zu durchlaufen, beginnend am Ende. Unser Ziel ist es, zehn aufeinanderfolgende Zeilenumbrüche zu finden, die das Vorhandensein der gewünschten Zeilen anzeigen. Anschließend lesen wir weiter, um diese Zeilen zu erfassen und dabei mögliche Codierungsvarianten zu berücksichtigen.

In C# beispielsweise behandelt eine umfassende Implementierung Fälle, in denen die Datei weniger als zehn Zeilen enthält. Der folgende Codeausschnitt veranschaulicht diesen Ansatz:

public static string ReadEndLines(string path, Int64 numberOfLines, Encoding encoding, string lineSeparator) {

    int sizeOfChar = encoding.GetByteCount("\n");
    byte[] buffer = encoding.GetBytes(lineSeparator);


    using (FileStream fs = new FileStream(path, FileMode.Open)) {
        Int64 lineCount = 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) == lineSeparator) {
                lineCount++;
                if (lineCount == numberOfLines) {
                    byte[] returnBuffer = new byte[fs.Length - fs.Position];
                    fs.Read(returnBuffer, 0, returnBuffer.Length);
                    return encoding.GetString(returnBuffer);
                }
            }
        }

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

Das obige ist der detaillierte Inhalt vonWie kann ich die letzten 10 Zeilen einer riesigen Textdatei effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn