不久前,我编写了以下较旧的代码。这背后的前提是,这是采用正则表达式并验证它是否符合条件。如果是这样,则让它在溪流中流过。当涉及到大型数据集 (5GB) 时,代码很差,因为它会读取整个文件以创建新流。
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(实际上是 nuget 上的 LumenWorks)类,它采用 StringReader 从流式传输数据以允许 Csv 访问。
我想做一些新的东西,不会将所有数据加载到任何对象中,相反,我想将其流式传输并在流式传输时过滤数据。这应该会减少我的内存占用。
我现在的想法是扩展 StringReader。我会扩展它,然后覆盖诸如 ReadLine 之类的方法。这个问题是我的正则表达式匹配模式是在线的。我的新正则表达式过滤 StringReader 的用户不会被迫使用 ReadLine() 检索数据。我不太确定如何解决这个问题。事实上,有许多不同的方法可以与 StringReader 一起使用(ReadBlock、ReadToEnd 等)。
所以我的问题是:
如何以内存有效的方式将过滤器应用于 StringReader,同时仍然保留它是 StringReader 的概念?
任何意见,将不胜感激。