Как применить фильтр к StringReader эффективным способом памяти? - PullRequest
0 голосов
/ 21 февраля 2020

Некоторое время назад я написал следующий более старый фрагмент кода. Причиной этого было то, что это было взять регулярное выражение и проверить, соответствует ли оно критериям. Если это так, то позвольте ему течь в потоке. Код плохо работает, когда речь идет о большом наборе данных (5 ГБ), когда он читает весь файл для создания нового потока.

    public static StringReader GetReader(String fileName, Regex r)
    {
        var sr = new StreamReader(fileName);
        List<string> lines = new List<string>();
        while (!sr.EndOfStream)
        {
            var stringContents = sr.ReadLine();
            if (r.IsMatch(stringContents))
            {
                lines.Add(stringContents);
            }
        }
        return new StringReader(String.Join(Environment.NewLine, lines));
    }

Потребитель нового StringReader на самом деле CsvReader (LumenWorks на nuget на самом деле) класс, который принимает StringReader для потоковой передачи данных, чтобы разрешить доступ Csv.

Я хочу сделать что-то новое, что не будет загружать все данные в какой-либо объект, скорее, я хотел бы потечь его и отфильтровать данные, когда я их передаю. Это должно уменьшить мой объем памяти.

Моя идея сейчас заключается в расширении StringReader. Я бы расширил его и затем переопределил методы, такие как ReadLine. Проблема в том, что мой шаблон сопоставления регулярных выражений идет по строкам. Пользователи моего нового фильтра регулярных выражений StringReader не обязаны извлекать данные с помощью ReadLine (). Я не совсем уверен, как справиться с этим. На самом деле существует много разных методов, которые можно использовать с StringReader (ReadBlock, ReadToEnd и т. Д. c).

Поэтому мой вопрос:

Как применить фильтр к StringReader эффективным способом памяти при сохранении концепции, что это StringReader?

Буду признателен за любой совет.

...