是否有可能在同一个IEnumerable上链接几个LINQ查询?
一些背景,
我有一些文件,大小为20-50Gb,它们不适合内存.有些代码会解析来自这样一个文件的消息,基本上可以:
public IEnumerable<Record> ReadRecordsFromStream(Stream inStream) {
Record msg;
while ((msg = ReadRecord(inStream)) != null) {
yield return msg;
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我对记录执行有趣的查询.例如,找到记录的平均持续时间
var records = ReadRecordsFromStream(stream);
var avg = records.Average(x => x.Duration);
Run Code Online (Sandbox Code Playgroud)
或者也许是每小时/分钟的记录数
var x = from t in records
group t by t.Time.Hour + ":" + t.Time.Minute into g
select new { Period = g.Key, Frequency = g.Count() };
Run Code Online (Sandbox Code Playgroud)
还有十几个我想运行的查询来从这些记录中提取相关信息.一些简单的查询当然可以组合在一个查询中,但这似乎很快就变得难以置信.
现在,每次运行这些查询时,我都必须从头开始读取文件,重新编写所有记录 - 解析20Gb文件20次需要花费时间,这是浪费.
我能做些什么才能只对文件进行一次传递,但对它运行几个linq查询?
您可能需要考虑使用Reactive Extensions.自从我使用它已经有一段时间了,但你可能会创建一个Subject<Record>,将所有查询附加到它(作为适当的IObservable<T>变量),然后连接数据源.这将通过各种聚合推送所有数据,仅从磁盘读取一次.
虽然确切的细节没有我自己下载最新的版本,但我在博客上写了几次:第1部分 ; 第2部分.(我抱怨第1部分中缺少的各种功能被添加:)