2011-01-31 62 views
2

是否有可能在同一個IEnumerable上鍊接幾個LINQ查詢?LINQ(對象),在相同的IEnumerable上運行多個查詢?

一些背景,

我有一些文件,20-50Gb在規模,他們將不適合在內存中。有些代碼解析來自這樣的文件的消息,基本上這樣做:

public IEnumerable<Record> ReadRecordsFromStream(Stream inStream) { 
      Record msg; 
      while ((msg = ReadRecord(inStream)) != null) { 
       yield return msg; 
      } 
     } 

這使我可以對記錄執行有趣的查詢。 例如查找記錄的平均持續時間

var records = ReadRecordsFromStream(stream); 
var avg = records.Average(x => x.Duration); 

或每小時記錄也許數/分鐘

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() }; 

而且還有AA十幾多個查詢我想運行拉相關信息出來這些記錄。一些簡單的查詢當然可以組合在一個查詢中,但這似乎很快就變得不可移植。現在

,每次我運行這些查詢的時候,我要讀再次從開頭的文件,所有記錄重新解析 - 解析一個20GB的文件20倍需要時間,而且是一種浪費。

我能做些什麼,能夠做的只是一個傳過來的文件,但針對它運行幾個LINQ查詢?

回答

5

你可能要考慮使用Reactive Extensions這一點。我已經使用過它一段時間了,但是您可能會創建一個Subject<Record>,將所有查詢附加到它(適當的IObservable<T>變量),然後連接數據源。這將通過各種聚合推送所有數據,只從磁盤讀取一次。

雖然確切細節逃避我沒有下載最新版本的自己,我在博客上這樣幾次:part 1; part 2。 (我抱怨是在第1部分缺失一些功能被加入:)

-1

有一種技術可以讓你做這種事情。這就是所謂的數據庫:)

+0

雖然DB會更有效地做的東西,我還是要對其運行多次查詢,數據庫將幾乎必須做一個全表掃描我的大部分的查詢每次。無論如何 - 這不是關於數據庫vs其他東西:) – Anonym 2011-01-31 23:58:22

+0

+1數據庫的想法。將所有內容全部讀入數據庫並永久查詢。你的比較是無效的,因爲數據庫針對這些事情進行了優化,就像使用linq來查詢這樣的事情一樣。與文件相比,數據庫的大小差異可能是非常大的 – Jimmy 2011-02-01 00:06:14

0

我已經與3-10MB /文件日誌之前做到了這一點。尚未達到該文件大小,但我試圖在1GB +總日誌文件中執行此操作,而不佔用大量的RAM。你可以試試我did