[問題] 如何實作可回收空間的Queue?

看板C_Sharp作者 (Tomex Ou)時間18年前 (2008/03/07 23:34), 編輯推噓4(4012)
留言16則, 5人參與, 最新討論串1/1
目標: ====== 我要實作一個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

03/08 02:43, , 1F
不是有內建的Quene了不好用?或是有什需求做不到?
03/08 02:43, 1F

03/08 02:51, , 2F
請看我的需求,就知道單純的Queue是很難處理byte[]資料的
03/08 02:51, 2F

03/08 02:55, , 3F
我比較對queue中的資料作很複雜的比對及跳躍,因此讀要好用
03/08 02:55, 3F

03/08 04:13, , 4F
拿塊記憶體 (byte[]) 去模擬環狀佇列 (ring queue)?
03/08 04:13, 4F

03/08 04:29, , 5F
問一下MemoryStream不能buffer一段資料嗎?這樣不會回收嗎
03/08 04:29, 5F

03/08 14:05, , 6F
ring queue是我以前的作法,利用read/write控制讀寫,然而
03/08 14:05, 6F

03/08 14:05, , 7F
寫沒問題,讀資料並parsing前後check碼時,若遇到byte[]尾端
03/08 14:05, 7F

03/08 14:06, , 8F
的截斷,我會損失一次parsed data,故詢問有否好的演算法...
03/08 14:06, 8F

03/08 14:10, , 9F
這讀取環狀queue並能像一維陣列解析資料,才是真正的技術點
03/08 14:10, 9F

03/08 14:13, , 10F
List<byte>目前能滿足,但它的GetRange()是採用copy方式讀取
03/08 14:13, 10F

03/08 14:17, , 11F
這樣的list本身效能就比byte[]差,讀取又是複製,效能更差
03/08 14:17, 11F

03/09 01:11, , 12F
把封包用一個class包起來Queue<className>去放不好嗎
03/09 01:11, 12F

03/09 22:06, , 13F
MemoryStream.SetLength(0);MemoryStream.Seek(0,Begin);
03/09 22:06, 13F

03/09 22:09, , 14F
這樣就可避免記憶體耗用過量的狀況.
03/09 22:09, 14F

03/15 18:16, , 15F
SetLength(0)會破壞尚有資料的queue該物件沒翻遍不敢上來問
03/15 18:16, 15F

03/15 18:17, , 16F
後來我發現要使用資料結構的link list來取代queue或array
03/15 18:17, 16F
文章代碼(AID): #17qM1ftQ (C_Sharp)