Удобное и быстрое чтение больших текстовых файлов (2-3 ТБ) на C#
Мне нужно обработать достаточно большие текстовые файлы (размером до нескольких терабайт), состоящие из временных последовательностей фреймов (блоков, записей?) следующего вида:
ITEM: TIMESTEP // заголовок
0
ITEM: NUMBER OF ATOMS
1000
ITEM: BOX BOUNDS pp pp pp
8.1154268336647561e-01 3.0288457316633668e+01
8.1154268336647561e-01 3.0288457316633668e+01
8.1154268336647561e-01 3.0288457316633668e+01
ITEM: ATOMS id type xs ys zs // основная часть
1 1 0.0458303 0.0893053 0.087739 // координаты, скорости и т. п.
2 1 0.120217 0.00714859 0.1049
3 1 0.0827161 0.160408 0.0186651
4 1 0.140222 0.136071 0.0827429
5 1 0.222306 0.106146 0.107203
...
1000 1 0.633306 0.0643522 0.0981721
Каждый такой фрейм содержит заголовок и основную часть в виде столбцов с координатами, скоростями и т. п. Не все поля из заголовка нужны для обработки. Не все столбцы из основной части нужны для обработки. Данные из файла читаются по одному фрейму.
В настоящее время метод чтения файла выглядит примерно так:
private bool ReadTimestep(StreamReader sr)
{
if (sr.EndOfStream) return false;
sr.ReadLine(); // ITEM: TIMESTEP
sr.ReadLine(); // %d
sr.ReadLine(); // ITEM: NUMBER OF ATOMS
numberOfAtoms = int.Parse(sr.ReadLine());
sr.ReadLine(); // ITEM: BOX BOUNDS pp pp pp
sr.ReadLine(); // %f %f
sr.ReadLine(); // %f %f
sr.ReadLine(); // %f %f
sr.ReadLine(); // ITEM: ATOMS id x y z
for (var i = 0; i < numberOfAtoms; i++)
{
var tokens = sr.ReadLine().Split(' ');
pos[i].X = float.Parse(tokens[1]);
pos[i].Y = float.Parse(tokens[2]);
pos[i].Z = float.Parse(tokens[3]);
}
return true;
}
Такой подход очень прост и достаточно производителен, но требует правки и перекомпиляции программы даже при небольших изменениях формата данных (например изменение количества или порядка столбцов в основной части фрейма).
Существуют ли какие-нибудь библиотеки для C#, позволяющие более элегантно организовать чтение такого файла?