2012-04-18 49 views
1

我有一個ArrayList,其中存儲100,000個數字。每個數字的長度爲10位或更小。該程序本身有數據輸入,其中它通過用戶輸入循環查看是否有任何數字已在陣列中使用if ArrayList.Contains(userinput)在程序中存儲數據時減少內存使用 - VB.NET/C#

看來,如果有一個這種大小的ArrayList正在使用很多內存。會有更快的方法來運行這個,例如數據庫或If TextFile.Contains(Line)

+2

如果您將數字作爲字符串存儲在您的列表中,您可以先將它們存儲爲數字,它會顯着減少您的內存使用量。 – assylias 2012-04-18 15:47:38

+0

您是否在關注速度或內存使用情況?請選擇哪一個更重要。至於內存,一個100000項'ArrayList'的'int's應該消耗大約1.5 Mb。 10個字符的字符串的100000個項目的數組應該大約爲3-5 Mb。你確定你有內存使用問題,只有**一個**'ArrayList'實例嗎? – 2012-04-18 16:07:24

+0

我實際上正在運行多個線程,這些線程不斷檢查列表是否包含X號碼,每個線程都是SyncLocked,並且當新的唯一號碼發揮作用時,ArrayList被推薦。我將列表,BinarySearch&存儲爲Integers一個嘗試,你怎麼能通過類型添加到ArrayList? – Chris 2012-04-18 16:31:59

回答

7

您應該使用List<T>來避免裝箱並節省內存。
使用HashSet<T>會快得多,但會比使用List<T>多一點點內存。

根據您的確切場景,數據庫可能是最好的。

4

另一種解決方案可以具有在100.000+元件的陣列排序順序並使用BinarySearch找到感興趣的元素。

Mush更快然後Contains呢,你不需要分配字典,所以沒有額外的內存消耗。

所有這些東西是測量挑選適合你的正確選擇在您的具體情況的主題。

0

只要您有併發讀/寫方案,請考慮使用System.Collections.Concurrent.ConcurrentDictionary<,>。它應該提供更好的性能,因爲它不需要鎖定其操作。但是,如果操作比簡單的add/get/remove更復雜,那麼您仍然需要鎖,並且應該更快(正如SLaks所建議的那樣)。