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

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

Barbara Streisand
Libérer: 2024-12-29 10:20:11
original
245 Les gens l'ont consulté

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

Récupération efficace des 10 dernières lignes à partir de fichiers texte massifs

Détermination de l'approche la plus efficace pour extraire les 10 dernières lignes d'un texte extrêmement volumineux fichier (dépassant 10 Go) nécessite une stratégie qui minimise les calculs surcharge.

Utilisation du positionnement de fichier et de la recherche inversée

L'approche recommandée consiste à naviguer jusqu'à la fin du fichier à l'aide de la méthode Seek() et à reculer progressivement dans le fichier jusqu’à rencontrer 10 nouvelles lignes. En maintenant un nombre de lignes, la méthode identifie le point de départ précis pour lire vers l'avant et récupérer les lignes souhaitées. Cette stratégie gère efficacement les fichiers comportant un nombre variable de lignes, y compris ceux comportant moins de 10.

Exemple d'implémentation en C#

Le code C# suivant illustre l'implémentation de approche précitée, généralisée pour localiser le dernier numberOfTokens dans un fichier codé par encodage et séparé par 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);
    }
}
Copier après la connexion

En utilisant cette technique, la récupération des 10 dernières lignes d'un gros fichier texte est réalisée avec une utilisation de mémoire et une complexité de calcul minimales, offrant une solution efficace pour ce scénario de traitement de fichiers courant.

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