作者tomex (Tomex Ou)
看板C_Sharp
標題[問題] 如何實作可回收空間的Queue?
時間Fri Mar 7 23:33:59 2008
目標:
======
我要實作一個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
1F:推 fillmore:不是有內建的Quene了不好用?或是有什需求做不到? 03/08 02:43
2F:→ tomex:請看我的需求,就知道單純的Queue是很難處理byte[]資料的 03/08 02:51
3F:→ tomex:我比較對queue中的資料作很複雜的比對及跳躍,因此讀要好用 03/08 02:55
4F:推 toki:拿塊記憶體 (byte[]) 去模擬環狀佇列 (ring queue)? 03/08 04:13
5F:推 fillmore:問一下MemoryStream不能buffer一段資料嗎?這樣不會回收嗎 03/08 04:29
6F:→ tomex:ring queue是我以前的作法,利用read/write控制讀寫,然而 03/08 14:05
7F:→ tomex:寫沒問題,讀資料並parsing前後check碼時,若遇到byte[]尾端 03/08 14:05
8F:→ tomex:的截斷,我會損失一次parsed data,故詢問有否好的演算法... 03/08 14:06
9F:→ tomex:這讀取環狀queue並能像一維陣列解析資料,才是真正的技術點 03/08 14:10
10F:→ tomex:List<byte>目前能滿足,但它的GetRange()是採用copy方式讀取 03/08 14:13
11F:→ tomex:這樣的list本身效能就比byte[]差,讀取又是複製,效能更差 03/08 14:17
12F:推 sheaujen:把封包用一個class包起來Queue<className>去放不好嗎 03/09 01:11
13F:→ wvsrugby:MemoryStream.SetLength(0);MemoryStream.Seek(0,Begin); 03/09 22:06
14F:→ wvsrugby:這樣就可避免記憶體耗用過量的狀況. 03/09 22:09
15F:→ tomex:SetLength(0)會破壞尚有資料的queue該物件沒翻遍不敢上來問 03/15 18:16
16F:→ tomex:後來我發現要使用資料結構的link list來取代queue或array 03/15 18:17