Удобное и быстрое чтение больших текстовых файлов (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#, позволяющие более элегантно организовать чтение такого файла?


Ответы (0 шт):