作者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