Это работает для меня в sqlite3:
SELECT *, MAX(rev) FROM t1 GROUP BY id
С * вы получаете дублированный столбец rev, но это не большая проблема.
Используйте следующий код:
var lines = File.ReadAllLines(fileName);
foreach (var line in lines)
Это было ОГРОМНОЕ различие в производительности чтения.
Это происходит за счет потребления памяти, но в полной мере это стоит!
В вопросе переполнения стека есть хорошая тема . Возвращается ли доход «медленнее, чем возвращается« старая школа »? .
Это говорит :
ReadAllLines загружает все строки в память и возвращает строку []. Все хорошо и хорошо, если файл небольшой. Если файл больше, чем поместится в память, у вас не хватит памяти.
ReadLines, с другой стороны, использует возврат доходности для возврата по одной строке за раз. С его помощью вы можете прочитать любой файл размера. Он не загружает весь файл в память.
Предположим, вы хотели найти первую строку, содержащую слово «foo», а затем выйти. Используя ReadAllLines, вам нужно будет прочитать весь файл в памяти, даже если «foo» встречается в первой строке. С ReadLines вы читаете только одну строку. Какой из них будет быстрее?
blockquote>
Вы не можете ускорить работу, если хотите использовать существующий API для чтения строк. Но чтение больших фрагментов и поиск вручную каждой новой строки в буфере чтения, вероятно, будут быстрее.
Если у вас достаточно памяти, я нашел прирост производительности, прочитав весь файл в потоке памяти , а затем открыл считыватель потоков, чтобы прочитать строки. Пока вы вообще планируете читать весь файл, это может привести к некоторым улучшениям.
Если вы используете .NET 4, просто используйте File.ReadLines
, который сделает все для вас. Я подозреваю, что много то же самое, что и ваш, за исключением того, что он также может использовать FileOptions.SequentialScan
и более крупный буфер (128 кажется очень маленьким).
Хотя 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
});
Если размер файла невелик, быстрее прочитать весь файл, а затем разделить строку:
var filestreams = sr.ReadToEnd().Split("\r\n".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries);
Если вы нацелены на скорость выполнения, да, вы. Код может быть короче с помощью конструктора StreamReader.