Maison > développement back-end > C++ > Comment puis-je récupérer efficacement les 10 dernières lignes d'un gigantesque fichier texte ?

Comment puis-je récupérer efficacement les 10 dernières lignes d'un gigantesque fichier texte ?

Mary-Kate Olsen
Libérer: 2025-01-05 10:23:41
original
439 Les gens l'ont consulté

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

Récupérer efficacement les 10 dernières lignes d'un fichier texte volumineux

Dans le domaine du traitement de texte à grande échelle, la récupération des dernières lignes d'un fichier exceptionnellement volumineux pose un problème défi unique. Un de ces fichiers, dont la taille dépasse 10 Go, présente un obstacle important à l'obtention efficace de ces données.

Pour résoudre ce problème, une approche efficace consiste à parcourir le fichier en arrière, en commençant par la fin. Notre objectif est de localiser dix nouvelles lignes consécutives, indiquant la présence des lignes souhaitées. Par la suite, nous lisons pour capturer ces lignes, en tenant compte des variations potentielles de codage.

Par exemple, en C#, une implémentation complète gère les cas où le fichier contient moins de dix lignes. L'extrait de code suivant illustre cette approche :

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);
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal