2010-11-17 27 views
1

例如,在我的ASP.Net應用程序中持久化內存中的IEnumerable會不會有問題?在內存中保留一個大集合,用於查詢

例如:

每天早晨,我的asp.net MVC應用程序需要從CSV文件中加載數據。 這個數據是從幾個CSV文件加載,然後,使用LINQ連接等。它合併成一個單一的,非標準化的集合,大約500,000個「事物」

應用程序的唯一目的是查詢這些數據。 方法,如:

  • GetThingsByName
  • GetThingsByPrice

等等

我的想法是隻是一個靜態的IEnumerable,該控制器可在打電​​話..?

這將在專用服務器上運行...

基本上,我試圖避免使用一個數據庫(任何種類的NoSQL或其他方式),因爲我不認爲這是需要做的,因爲數據相當不穩定。

查詢將使用LINQ完成。

+0

你有使用老式的DataViews爲查找考慮?如下文所述,LINQ查詢只用從ILDASM LINQ應至少一次查看產生IL穿透整個集合 – cordialgerm 2010-11-17 08:06:54

回答

5

我同意帕維爾。它也高度依賴於你將要運行的查詢類型。如果你正在做很多聚合,你可能會需要像SQLite這樣的內存數據庫,或者甚至像MySQL或SQL Server這樣的全功能數據庫。如果您只是通過PK進行查找,那麼您可能會將數據存儲在HashMap或類似的地方。

IEnumerable和LINQ-to-Objects並不神奇。它們只是提供查詢和聚合的通用界面。如果您的實際實現的IEnumerable類是List,那麼猜猜看是什麼?當你說:

var query = from item in items // items is a List<T> 
      where item.Name.StartsWith("Foo") 
       && item.CreationDate > new DateTime(2010,1,1) 
      select item; 
var allFoos = query.ToList(); 

然後LINQ到對象是要通過在內存中的所有對象500000檢查迭代是否where子句是滿意的。將不會有索引或其他查詢優化發生。你將通過記憶進行線性搜索!

+1

迭代每一個程序員和他自己的眼睛看有沒有魔法。它只是每個項目的召喚代表類型的魔法,也就是語法糖。 – 2010-11-17 16:55:58

0

如果你有內存,丟失數據不是問題,並且與數據的「主」源同步很容易,那麼我不會看到這種方法的問題。如果不知道數據的結構和原始來源,很難多說。

0

這一切取決於您需要處理多少內存以及這些數據結構有多大。我們是在談論布爾和整數或更大的複雜類型,佔用很多字節的內存?

訪問這些記錄多少次,以及從數據庫訪問需要多少時間?

還有一些統計數據會很好。

3

你有什麼樣的結構記錄?因爲在同一句話中只看到「IEnumerable」,「500 000」和「查詢」這樣的詞讓我感到不適(看看LINQ是如何工作的,你會理解的)。
您是否考慮過其他選項,如使用內存數據庫? SQLite例如

+0

(也顫抖) – 2010-11-17 06:00:50

0

這是可行的。我在一個類似的系統上工作,只是在(大)內存中保留大約2.x百萬項。通過主鍵訪問(僅)。 Ther是其他一些元素(相關項目),但是我從數據庫中獲得了這些罕見評估的pk。

我的問題在於那些元素一直在變化。這意味着需要接受一些數字(有時甚至幾十萬)PER SECOND的變化。

Iti是一種罕見的情況,在這種情況下,在內存中保持行蹤幾乎是「它」(如:唯一的方式)。服務器每週重新啓動一次(GC在這裏是無用的 - 如果一個項目將退休,它將......在最後一個GC「片段」),以給予一個新的開始。 Memroy用過?大(需要64位),但它是可行的。只有這裏。還會記錄更改,然後將其處理到數據庫中供以後查詢。

如果你可以,遠離這樣的方法。

的應用程序的唯一目的是查詢此 數據。方法,如:

•GetThingsByName•GetThingsByPrice

在這裏你關閉。 GetThingsByPrice在沒有索引的情況下不會工作,並且在內存中的索引是HARD(我不這樣做 - 通過符號獲取....這是「名稱」....是我在內存中支持的唯一搜索方法)。最有可能不值得的努力。如果您需要查詢,請將其推送到真實的數據庫。詹姆斯科瓦奇在他的回答中非常出色。一個簡單的IEnumeable將不起作用,你將不得不實現一個完整的LINY quer4y提供程序,包括....高級搜索評估(哪個順序等)是NASTY。即使按名稱查看也是不好的...我在這裏使用了一個特殊的API(沒有LINY),在這個名稱中輸入名稱,並在散列表中進行引用查找。

相關問題