Как оптимизировать List есть проверка элемента? C # [дубликат]

239
задан Peter Mortensen 6 July 2015 в 09:07
поделиться

8 ответов

Используйте следующий код:

var lines = File.ReadAllLines(fileName);
foreach (var line in lines)

Это было ОГРОМНОЕ различие в производительности чтения.

Это происходит за счет потребления памяти, но в полной мере это стоит!

5
ответ дан Chris McFarland 15 August 2018 в 23:27
поделиться

В вопросе переполнения стека есть хорошая тема . Возвращается ли доход «медленнее, чем возвращается« старая школа »? .

Это говорит :

ReadAllLines загружает все строки в память и возвращает строку []. Все хорошо и хорошо, если файл небольшой. Если файл больше, чем поместится в память, у вас не хватит памяти.

ReadLines, с другой стороны, использует возврат доходности для возврата по одной строке за раз. С его помощью вы можете прочитать любой файл размера. Он не загружает весь файл в память.

Предположим, вы хотели найти первую строку, содержащую слово «foo», а затем выйти. Используя ReadAllLines, вам нужно будет прочитать весь файл в памяти, даже если «foo» встречается в первой строке. С ReadLines вы читаете только одну строку. Какой из них будет быстрее?

3
ответ дан Community 15 August 2018 в 23:27
поделиться

Вы не можете ускорить работу, если хотите использовать существующий API для чтения строк. Но чтение больших фрагментов и поиск вручную каждой новой строки в буфере чтения, вероятно, будут быстрее.

1
ответ дан jgauffin 15 August 2018 в 23:27
поделиться

Если у вас достаточно памяти, я нашел прирост производительности, прочитав весь файл в потоке памяти , а затем открыл считыватель потоков, чтобы прочитать строки. Пока вы вообще планируете читать весь файл, это может привести к некоторым улучшениям.

1
ответ дан Kibbee 15 August 2018 в 23:27
поделиться

Если вы используете .NET 4, просто используйте File.ReadLines , который сделает все для вас. Я подозреваю, что много то же самое, что и ваш, за исключением того, что он также может использовать FileOptions.SequentialScan и более крупный буфер (128 кажется очень маленьким).

188
ответ дан Martin Liversage 15 August 2018 в 23:27
поделиться
  • 1
    Спасибо за это - ваше включение параметра размера буфера в конструктор StreamReader действительно помогло. Я транслирую с S3 API от Amazon, и использование соответствующего размера буфера значительно ускоряет работу в сочетании с ReadLine (). – Richard K. 13 January 2013 в 02:30
  • 2
    Я не понимаю. Теоретически, большую часть времени, затрачиваемое на чтение файла, будет временем поиска на диске и накладными расходами на потоки, например, с файлами File.ReadLines. File.ReadLines, с другой стороны, должен читать все файлы в памяти за один раз. Как это может быть хуже в производительности? – h9uest 21 January 2015 в 16:55
  • 3
    Я не могу сказать о скорости, но одно можно сказать наверняка: это намного хуже при использовании памяти. Если вам приходится обрабатывать очень большие файлы (например, GB), это очень важно. Еще больше, если это означает, что он должен менять память. Со стороны скорости вы можете добавить, что ReadAllLine должен читать ВСЕ строки, прежде чем возвращать обработку задержки с задержкой. В некоторых сценариях скорость IMPRESSION более важна, чем необработанная скорость. – bkqc 16 September 2016 в 13:39
  • 4
    ваше включение образца кода велико, спасибо – sdjuan 28 October 2016 в 20:58
  • 5
    Другим преимуществом ReadLines() является то, что он ленив, поэтому хорошо работает с LINQ. – stt106 20 April 2017 в 10:02

Хотя File.ReadAllLines() является одним из простейших способов чтения файла, он также является одним из самых медленных.

Если вы просто хотите читать строки в файле, не делая многого, в соответствии с этими критериями , самым быстрым способом чтения файла является старый метод:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
               //do minimal amount of work here
        }
}

Однако, если вам приходится много делать с каждой строкой, тогда в этой статье делается вывод о том, что лучший способ заключается в следующем (и быстрее предварительно назначить строку [], если вы знаете, сколько строк вы собираетесь читать):

AllLines = new string[MAX]; //only allocate memory here

using (StreamReader sr = File.OpenText(fileName))
{
        int x = 0;
        while (!sr.EndOfStream)
        {
               AllLines[x] = sr.ReadLine();
               x += 1;
        }
} //Finished. Close the file

//Now parallel process each line in the file
Parallel.For(0, AllLines.Length, x =>
{
    DoYourStuff(AllLines[x]); //do your work here
});
25
ответ дан Rakitić 15 August 2018 в 23:27
поделиться

Если размер файла невелик, быстрее прочитать весь файл, а затем разделить строку:

var filestreams = sr.ReadToEnd().Split("\r\n".ToCharArray(), 
                              StringSplitOptions.RemoveEmptyEntries);
2
ответ дан Saeed Amiri 15 August 2018 в 23:27
поделиться
  • 1
    File.ReadAllLines() – jgauffin 7 November 2011 в 15:33
  • 2
    @jgauffin Я не знаю, позади реализации file.ReadAlllines (), но я думаю, что у него ограниченный буфер, а буфер fileReadtoEnd должен быть больше, поэтому число доступа к файлу будет уменьшено таким образом и будет выполняться string.Split в размер файла case невелик, чем множественный доступ к файлу. – Saeed Amiri 7 November 2011 в 15:37
  • 3
    Я сомневаюсь, что File.ReadAllLines имеет фиксированный размер буфера, так как размер файла известен. – jgauffin 7 November 2011 в 16:06
  • 4
    @jgauffin: В .NET 4.0 File.ReadAllLines создается список и добавляется в этот список в цикле, используя StreamReader.ReadLine (с возможностью перераспределения базового массива). Этот метод использует размер буфера по умолчанию 1024. В StreamReader.ReadToEnd избегается часть разбора строк, и размер буфера может быть установлен в конструкторе, если это необходимо. – Martin Liversage 7 November 2011 в 16:26

Если вы нацелены на скорость выполнения, да, вы. Код может быть короче с помощью конструктора StreamReader.

1
ответ дан zmilojko 15 August 2018 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: