看板 C_Sharp 關於我們 聯絡資訊
目標: ====== 我要實作一個queue的行為,以接收網路傳來的封包 資料不斷被新增至該queue, 但我會有一個parser去過濾資料, 已處理過的資料即可至queue中移除。 想法: ====== 1. 首先我採用MemoryStream物件不斷加入資料 也可以用Read(buffer, count)來讀資料 Position會不斷成長, 但MemoryStream無法移除已處理過的資料 這會造成記憶體最終爆掉 ==> 不可行! 2. 使用List<byte>來加入資料,它可以一次AddRange(byte[]) 也可以RemoveRange(),看起來似乎可行。 但該list在讀取資料時是一個byte持續去讀,非常不方便 看起來也不可行... (讀取資料作parsing很重要) 問題: ===== 基於以上的想法及疑慮,不曉得先進們有否好的解法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.146.5.194
fillmore:不是有內建的Quene了不好用?或是有什需求做不到? 03/08 02:43
tomex:請看我的需求,就知道單純的Queue是很難處理byte[]資料的 03/08 02:51
tomex:我比較對queue中的資料作很複雜的比對及跳躍,因此讀要好用 03/08 02:55
toki:拿塊記憶體 (byte[]) 去模擬環狀佇列 (ring queue)? 03/08 04:13
fillmore:問一下MemoryStream不能buffer一段資料嗎?這樣不會回收嗎 03/08 04:29
tomex:ring queue是我以前的作法,利用read/write控制讀寫,然而 03/08 14:05
tomex:寫沒問題,讀資料並parsing前後check碼時,若遇到byte[]尾端 03/08 14:05
tomex:的截斷,我會損失一次parsed data,故詢問有否好的演算法... 03/08 14:06
tomex:這讀取環狀queue並能像一維陣列解析資料,才是真正的技術點 03/08 14:10
tomex:List<byte>目前能滿足,但它的GetRange()是採用copy方式讀取 03/08 14:13
tomex:這樣的list本身效能就比byte[]差,讀取又是複製,效能更差 03/08 14:17
sheaujen:把封包用一個class包起來Queue<className>去放不好嗎 03/09 01:11
wvsrugby:MemoryStream.SetLength(0);MemoryStream.Seek(0,Begin); 03/09 22:06
wvsrugby:這樣就可避免記憶體耗用過量的狀況. 03/09 22:09
tomex:SetLength(0)會破壞尚有資料的queue該物件沒翻遍不敢上來問 03/15 18:16
tomex:後來我發現要使用資料結構的link list來取代queue或array 03/15 18:17