Чтение текстовых строк с помощью c # [duplicate]

Это работает для меня в sqlite3:

SELECT *, MAX(rev) FROM t1 GROUP BY id

С * вы получаете дублированный столбец rev, но это не большая проблема.

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

8 ответов

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

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

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

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

5
ответ дан Chris McFarland 3 September 2018 в 13:46
поделиться

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

Это говорит :

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

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

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

3
ответ дан Community 3 September 2018 в 13:46
поделиться

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

1
ответ дан jgauffin 3 September 2018 в 13:46
поделиться

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

1
ответ дан Kibbee 3 September 2018 в 13:46
поделиться

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

188
ответ дан Martin Liversage 3 September 2018 в 13:46
поделиться

Хотя 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
ответ дан Raktim Biswas 3 September 2018 в 13:46
поделиться

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

var filestreams = sr.ReadToEnd().Split("\r\n".ToCharArray(), 
                              StringSplitOptions.RemoveEmptyEntries);
2
ответ дан Saeed Amiri 3 September 2018 в 13:46
поделиться

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

1
ответ дан zmilojko 3 September 2018 в 13:46
поделиться
Другие вопросы по тегам:

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