2 votes

Comment charger un fichier de mots dans une liste où le fichier compte plus de 3 millions de lignes ?

Est-il possible de charger un fichier de 3 ou 4 millions de lignes en moins d'une seconde (1.000000) ? Une ligne contient un mot. La longueur des mots varie de 1 à 17 (est-ce important ?).

Mon code est maintenant :

List<string> LoadDictionary(string filename)
{
    List<string> wordsDictionary = new List<string>();

    Encoding enc = Encoding.GetEncoding(1250);//I need     etc.
    using (StreamReader r = new StreamReader(filename, enc))
    {
        string line = "";
        while ((line = r.ReadLine()) != null)
        {
            if (line.Length > 2)
            {
                wordsDictionary.Add(line);
            }
        }
    }

    return wordsDictionary;
}

Résultats de l'exécution chronométrée :

time of loading 4 million words - pic result

Comment puis-je forcer la méthode pour qu'elle s'exécute en deux fois moins de temps ?

5voto

brian519 Points 298

Si vous savez que votre liste sera importante, vous devez fixer une bonne capacité de départ.

List<string> wordsDictionary = new List<string>( 100000 );

Si vous ne le faites pas, la liste devra continuer à augmenter sa capacité, ce qui prend un peu de temps. Vous ne réduirez probablement pas ce temps de moitié, mais c'est un début.

4voto

p.campbell Points 42771

Comment File.ReadAllLines() et quelques performances LINQ ?

public List<string> LoadDictionary(string filename)
{
    List<string> wordsDictionary = new List<string>();
    Encoding enc = Encoding.GetEncoding(1250);
    string[] lines = File.ReadAllLines(filename,enc);
    wordsDictionary.AddRange(lines.Where(x => x.Length > 2));
    return wordsDictionary;
}

1voto

StriplingWarrior Points 56276

Le plus gros problème de performance à ce stade est probablement lié à l'extraction des données du disque dur vers la mémoire. Il est peu probable que vous puissiez faire quoi que ce soit pour l'accélérer, à moins d'acquérir un meilleur matériel.

0voto

Adrian McCarthy Points 17018

Profil. Profil. Profil.

Nous pouvons tous deviner où le temps est passé et proposer d'autres méthodes qui pourraient être plus rapides. Certains d'entre nous peuvent même avoir une bonne intuition ou avoir de la chance et tomber sur la bonne réponse. Mais il sera beaucoup plus productif de mesurer, d'itérer et de mesurer encore.

Raymond Chen a fait une série intéressante sur charger un dictionnaire chinois/anglais et obtenir un temps de chargement rapide. Ce n'est pas exactement la même chose (il fait la conversion des caractères et quelques analyses simples, et le dictionnaire est un peu plus petit) et c'est dans une autre langue. Mais je recommande quand même la série, car elle montre la bonne façon d'optimiser quelque chose comme ça : profil, profil, profil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X