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); } }
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!