内存高效的IList <t>实现</t>

时间:2013-01-10 13:50:15

标签: c# .net list sockets collections

我的套接字应用程序中需要一个收集字节的集合类型(处理大约5k的并发连接)。

我尝试使用List<byte>,但由于它有一个内部数组并且我收到大量数据,因此可能会导致OutOfMemoryException

所以我需要一个集合,

  • 将数据保存在较小的块中;比如Unrolled Linked List
  • 提供快速查找(最好是IList<T>),因为我在每次接收操作后都会查找标记消息结束的分隔符。

我现在使用的是Stream。我为不涉及太多数据的操作提供MemoryStream,并为涉及大量数据的操作提供FileStream临时文件。

MemoryStreamList<T>没什么区别,但我不想将文件用作缓冲区。

所以...
你推荐什么样的集合或方法?

2 个答案:

答案 0 :(得分:0)

您似乎正在为网络应用程序使用不适当的体系结构。您应该只缓冲那些所需的数据。在这里,您使用一个列表来缓冲数据,直到收到所需的数据量。

我建议你应该检查数据本身每次接收数据的分隔符,如果它在那里,你应该只输入数据直到遇到分隔符。数据准备好后,您应该从列表中取出并使用它并从列表中删除。将所有内容添加到列表中并不是一个好方法,肯定会占用大量内存。

理想情况下,您应该拥有一个协议,在您实际收到有关您将要接收的数据长度的数据之前,该协议始终会通知您。这样,您可以确保已收到所需的数据,并且您不应该依赖分隔符。

答案 1 :(得分:0)

可能的快速而肮脏的解决方案:

在程序开始时,为您将收到的最大数据量分配足够大的缓冲区。使用单独的“计数”字段来跟踪当前正在使用的数据量。

(我真的不喜欢这个解决方案;我会使用文件或者在块中找到一些处理数据的方法,但它可能适合你。)