Pour trouver le moyen le plus rapide de lire un fichier ligne par ligne, vous devrez effectuer une analyse comparative. J'ai fait quelques petits tests sur mon ordinateur mais vous ne pouvez pas vous attendre à ce que mes résultats s'appliquent à votre environnement.
Utilisation de StreamReader.ReadLine
C'est fondamentalement votre méthode. Pour une raison quelconque, vous définissez la taille du tampon sur la plus petite valeur possible (128). Augmenter cela augmentera généralement les performances. La taille par défaut est 1 024 et d'autres bons choix sont 512 (la taille du secteur dans Windows) ou 4 096 (la taille du cluster dans NTFS). Vous devrez exécuter un benchmark pour déterminer une taille de tampon optimale. Un tampon plus gros n'est - sinon plus rapide - du moins pas plus lent qu'un tampon plus petit.
const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(fileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
String line;
while ((line = streamReader.ReadLine()) != null)
// Process line
}
Le FileStream
constructeur vous permet de spécifier FileOptions . Par exemple, si vous lisez un gros fichier séquentiellement du début à la fin, vous pouvez en bénéficier FileOptions.SequentialScan
. Encore une fois, l'analyse comparative est la meilleure chose que vous puissiez faire.
Utilisation de File.ReadLines
Cela ressemble beaucoup à votre propre solution, sauf qu'elle est implémentée à l'aide d'un StreamReader
avec une taille de tampon fixe de 1 024. Sur mon ordinateur, cela entraîne des performances légèrement meilleures par rapport à votre code avec une taille de tampon de 128. Cependant, vous pouvez obtenir la même augmentation de performances en utilisant une taille de tampon plus grande. Cette méthode est implémentée à l'aide d'un bloc itérateur et ne consomme pas de mémoire pour toutes les lignes.
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
Utilisation de File.ReadAllLines
Cela ressemble beaucoup à la méthode précédente, sauf que cette méthode développe une liste de chaînes utilisées pour créer le tableau de lignes renvoyé, de sorte que les besoins en mémoire sont plus élevés. Cependant, il revient String[]
et ne IEnumerable<String>
vous permet pas d'accéder au hasard aux lignes.
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
Utilisation de String.Split
Cette méthode est considérablement plus lente, au moins sur les gros fichiers (testée sur un fichier de 511 Ko), probablement en raison de la façon dont elle String.Split
est implémentée. Il alloue également un tableau pour toutes les lignes, augmentant la mémoire requise par rapport à votre solution.
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
Ma suggestion est d'utiliser File.ReadLines
car il est propre et efficace. Si vous avez besoin d'options de partage spéciales (par exemple que vous utilisez FileShare.ReadWrite
), vous pouvez utiliser votre propre code mais vous devez augmenter la taille du tampon.
Fastest
vous dire des perspectives de performance ou de développement?