Некоторое время назад я написал следующий более старый фрагмент кода. Причиной этого было то, что это было взять регулярное выражение и проверить, соответствует ли оно критериям. Если это так, то позвольте ему течь в потоке. Код плохо работает, когда речь идет о большом наборе данных (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?
Буду признателен за любой совет.