Как загрузить файл со словами в список, где файл содержит более 3 миллионов строк - PullRequest
2 голосов
/ 09 ноября 2011

Можно ли загрузить файл с 3 или 4 миллионами строк менее чем за 1 секунду (1,000000)?Одна строка содержит одно слово.Длина слов варьируется от 1 до 17 (это имеет значение?).

Мой код теперь:

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

Результаты выполнения по времени:

time of loading 4 million words - pic result

Как заставить метод выполнить его в два раза быстрее?

Ответы [ 4 ]

5 голосов
/ 09 ноября 2011

Если вы знаете, что ваш список будет большим, вы должны установить хорошую стартовую емкость.

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

Если вы этого не сделаете, список должен будет продолжать увеличивать свою емкость, что занимает немного времени. Вероятно, не сократит это вдвое, но это начало

4 голосов
/ 09 ноября 2011

Как работает File.ReadAllLines() и некоторые 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;
}
1 голос
/ 09 ноября 2011

В данный момент ваш самый большой выигрыш в производительности - это, вероятно, просто извлечение данных с жесткого диска в память. Маловероятно, что вы можете сделать что-либо, чтобы заставить его работать намного быстрее, если не считать лучшего оборудования.

0 голосов
/ 09 ноября 2011

Профиль.Профиль.Профиль.

Мы все можем угадать, на что тратится время, а затем предложить другие методы, которые могут быть быстрее.У некоторых из нас может быть даже хорошая интуиция, или нам повезет, и вы наткнетесь на правильный ответ.Но гораздо эффективнее будет измерять, повторять и измерять снова.

Раймонд Чен сделал интересную серию о загрузке китайско-английского словаря и ускорении времени загрузки.Это не совсем то же самое (он делает преобразование символов и некоторый простой анализ, а словарь был немного меньше), и это на другом языке.Но я все равно рекомендую эту серию, потому что она показывает правильный способ оптимизации примерно так: профиль, профиль, профиль.

...