2010-07-30 89 views
4

計劃有一個數據結構來將臨時二進制數據存儲在內存中進行分析。哪種數據結構適合臨時大二進制數據存儲?

數據的最大尺寸約爲10MB

數據將一次添加在末尾408 bytes

沒有搜索,檢索對這些臨時二進制數據的操作。

數據將被清除,存儲將被重新用於下一次分析。

問題:

  1. 其結構有利於這一目的? byte[10MB], List<bytes>(10MB), List<MyStruct>(24000), or ...?
  2. 如何快速清除數據(不是List.Clear(),只需將該值設置爲0)用於List或數組?
  3. 如果我說List.Clear(),這個List內存將縮小或列表的容量(存儲)仍然存在,當我打電話List.AddRange()Clear()?
  4. List.Insert(後無內存分配)會令大名單或者它只是取代現有的項目?
+0

我們在談論什麼樣的「檢索操作」?處理408個字節的單個塊? – 2010-07-30 17:53:34

+0

表示從數據中間取出數據 – 5YrsLaterDBA 2010-07-30 17:55:06

+0

但您打算怎麼做?你能描述一下你要做什麼樣的「分析」? – 2010-07-30 18:00:28

回答

0

如果您的數據通常是相同的大小,並且始終低於一定的大小,請使用字節數組。

創建一個字節[]和一個int,讓您知道該緩衝區的「全部」部分的末尾停止並且「空閒」部分開始的位置。你永遠不需要清除它;只是改寫了那裏。唯一的問題是如果您的數據有時是100 kb,有時是10 MB,有時比您原先計劃的大一點。

雖然列表在使用時會處理各種大小的數據,但使用速度較慢,內存容量較大。

+0

大小並不總是相同 – 5YrsLaterDBA 2010-07-30 18:06:38

+0

如果它總是在同一個球場,這仍然工作得很好;如果你總是在5-10米,而從未超過10兆,給自己一個10兆陣列緩衝區。 – 2010-07-30 18:51:32

0
using (System.IO.MemoryStream memStream = new System.IO.MemoryStream()) 
{ 
    Do stuff 
} // the using ensures proper simple disposal occurs here so you don't have to worry about cleaning up. 
+0

這個規則有一定的邏輯:如果它實現了IDisposable,Dispose它。但有時我們被允許鍛鍊我們的大腦。 IDisposable的目的是在GC開始釋放內存之前就放棄* external *資源。你想象一下MemoryStream有哪些外部資源?我會給你答案:沒有。 – Tergiver 2010-07-30 18:43:45

1

你必須描述你在做什麼更以提供更好的答案,但它聽起來像你擔心效率/ PERF所以

  1. 的byte []
  2. 沒有必要清除陣列,只是跟蹤在當前的週期 '結束' 是
  3. N/A
  4. N/A
相關問題