2010-12-11 31 views
3

我有一個items.xml文件,一旦應用程序啓動就會加載到內存中。 items.xml中的每個元素都被「轉換」爲Item(它只有很少的int &字符串屬性),然後添加到項目列表中。項目列表應該包含數千個實例Item將數據存儲在內存中,這是一個好方法嗎?

在對象中存儲數據(在我的示例中爲Item類)可以嗎?有沒有另外一種方法將這些數據存儲在內存中?

回答

7

一是擔心會用的功能減少內存使用。其次,擔心表現。剖析應用程序並查看它在哪些方面會影響性能。它可能永遠不會在你的配置。但是,如果您在此區域遇到性能問題,請嘗試爲單個或子項目創建密鑰。通過這種方式,您可以使用鍵和項目(或項目列表)填充一個或多個字典,從而減少對該項目的訪問時間。

請記住,這些查找字典是「便宜」的,因爲它們只存儲對項目的引用,而不是對象的副本。

+2

聲譽意味着什麼...偉大的答案卡羅! +1。 – mattmc3 2010-12-11 13:49:08

+1

有時我覺得表演是全部......感謝提醒我=] – 2010-12-11 14:00:01

1

這很好,你會使用一種類型的對象或另一種類型的對象,所以自定義的對象是一個不錯的選擇。

還有其他方法可以加載和查詢XML數據 - 例如使用XDocument並使用Linq to XML查詢它。

0

不知道這些Item物體的用途是什麼,我無法肯定地說,但是您描述的內容聽起來完全可以。

如果您有100,000個這樣的對象(而不是1,000個),那麼List就不是最好的數據結構。有兩種方法來解決這個問題。或者將它作爲一個列表,然後在出現問題時處理,或者現在就修復它。

前者意味着您現在沒有工作要做,但您將來可以完成的工作量不得而知 - 稍後會對數據結構的變化產生更多潛在影響(需要更多的代碼更改,可能的錯誤被引入)。

後者意味着現在已知的工作量,但是(希望)未來不會有任何工作,因爲您已經選擇了可縮放的數據結構。但是,要小心過早的優化。如果你的列表永遠不會超出它的當前大小,那麼你已經完成了這項工作,沒有任何收穫。

5

這很好,只要你確保你不吃東西全部內存應該沒問題。我已經爲具有更大數字的複雜系統做了這個。

如果您的數據經常被什麼東西其他比在列表中的索引訪問,你可能想使用字典來索引項,例如:

Dictionary<string, Item> lookup = 
    list.ToDictionary(x => x.Code); 

然後你可以訪問:

Item item = lookup["abc012"]; 

另外;如果許多字符串值重複使用,則可以通過編寫自己的內部函數來節省一些空間;

Dictionary<string,string> interner = 
    new Dictionary<string,string>(); 
foreach(Item item in list) { 
    string s, name = item.Name; 
    if(interner.TryGetValue(name, out s)) 
     item.Name = s; 
    else 
     interner.Add(name, name); 
} 

這將僅保存和重新使用唯一的字符串

+0

好方法!使用cpu over ram :) – 2010-12-11 13:51:01

+0

@Zippo好吧,畢竟你只做過一次。也可以使它整潔。 – 2010-12-11 13:54:51

0

您的項目列表是隻讀還是需要處理修改?如果它是隻讀的,那麼到目前爲止,大家的建議都很好。如果你的內存中的對象是可修改的,那麼還有很多問題沒有答案。

如果你要處理的修改,你會如何:

  1. ...處理的併發訪問?
  2. ...將您的項目列表同步到XML文檔?
  3. ...如果有人修改了底層的XML文檔,會過期內存中的緩存嗎?
  4. ...確保在應用程序崩潰/重新啓動時不會丟失數據?

使用內存中的對象進行快速訪問是一種很好的做法,而且我一直都是自己做的。但是,如果你的數據不穩定,這不是一個簡單的解決方案。在這種情況下,您應該使用符合ACID的數據庫。

相關問題