我有一個items.xml文件,一旦應用程序啓動就會加載到內存中。 items.xml中的每個元素都被「轉換」爲Item
(它只有很少的int &字符串屬性),然後添加到項目列表中。項目列表應該包含數千個實例Item
。將數據存儲在內存中,這是一個好方法嗎?
在對象中存儲數據(在我的示例中爲Item
類)可以嗎?有沒有另外一種方法將這些數據存儲在內存中?
我有一個items.xml文件,一旦應用程序啓動就會加載到內存中。 items.xml中的每個元素都被「轉換」爲Item
(它只有很少的int &字符串屬性),然後添加到項目列表中。項目列表應該包含數千個實例Item
。將數據存儲在內存中,這是一個好方法嗎?
在對象中存儲數據(在我的示例中爲Item
類)可以嗎?有沒有另外一種方法將這些數據存儲在內存中?
一是擔心會用的功能減少內存使用。其次,擔心表現。剖析應用程序並查看它在哪些方面會影響性能。它可能永遠不會在你的配置。但是,如果您在此區域遇到性能問題,請嘗試爲單個或子項目創建密鑰。通過這種方式,您可以使用鍵和項目(或項目列表)填充一個或多個字典,從而減少對該項目的訪問時間。
請記住,這些查找字典是「便宜」的,因爲它們只存儲對項目的引用,而不是對象的副本。
這很好,你會使用一種類型的對象或另一種類型的對象,所以自定義的對象是一個不錯的選擇。
還有其他方法可以加載和查詢XML數據 - 例如使用XDocument
並使用Linq to XML查詢它。
不知道這些Item
物體的用途是什麼,我無法肯定地說,但是您描述的內容聽起來完全可以。
如果您有100,000個這樣的對象(而不是1,000個),那麼List
就不是最好的數據結構。有兩種方法來解決這個問題。或者將它作爲一個列表,然後在出現問題時處理,或者現在就修復它。
前者意味着您現在沒有工作要做,但您將來可以完成的工作量不得而知 - 稍後會對數據結構的變化產生更多潛在影響(需要更多的代碼更改,可能的錯誤被引入)。
後者意味着現在已知的工作量,但是(希望)未來不會有任何工作,因爲您已經選擇了可縮放的數據結構。但是,要小心過早的優化。如果你的列表永遠不會超出它的當前大小,那麼你已經完成了這項工作,沒有任何收穫。
這很好,只要你確保你不吃東西全部內存應該沒問題。我已經爲具有更大數字的複雜系統做了這個。
如果您的數據經常被什麼東西其他比在列表中的索引訪問,你可能想使用字典來索引項,例如:
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);
}
這將僅保存和重新使用唯一的字符串
好方法!使用cpu over ram :) – 2010-12-11 13:51:01
@Zippo好吧,畢竟你只做過一次。也可以使它整潔。 – 2010-12-11 13:54:51
您的項目列表是隻讀還是需要處理修改?如果它是隻讀的,那麼到目前爲止,大家的建議都很好。如果你的內存中的對象是可修改的,那麼還有很多問題沒有答案。
如果你要處理的修改,你會如何:
使用內存中的對象進行快速訪問是一種很好的做法,而且我一直都是自己做的。但是,如果你的數據不穩定,這不是一個簡單的解決方案。在這種情況下,您應該使用符合ACID的數據庫。
聲譽意味着什麼...偉大的答案卡羅! +1。 – mattmc3 2010-12-11 13:49:08
有時我覺得表演是全部......感謝提醒我=] – 2010-12-11 14:00:01