我的套接字应用程序中需要一个收集字节的集合类型(处理大约5k的并发连接)。
我尝试使用List<byte>
,但由于它有一个内部数组并且我收到大量数据,因此可能会导致OutOfMemoryException
。
所以我需要一个集合,
IList<T>
),因为我在每次接收操作后都会查找标记消息结束的分隔符。我现在使用的是Stream
。我为不涉及太多数据的操作提供MemoryStream
,并为涉及大量数据的操作提供FileStream
临时文件。
MemoryStream
与List<T>
没什么区别,但我不想将文件用作缓冲区。
所以...
你推荐什么样的集合或方法?
答案 0 :(得分:0)
您似乎正在为网络应用程序使用不适当的体系结构。您应该只缓冲那些所需的数据。在这里,您使用一个列表来缓冲数据,直到收到所需的数据量。
我建议你应该检查数据本身每次接收数据的分隔符,如果它在那里,你应该只输入数据直到遇到分隔符。数据准备好后,您应该从列表中取出并使用它并从列表中删除。将所有内容添加到列表中并不是一个好方法,肯定会占用大量内存。
理想情况下,您应该拥有一个协议,在您实际收到有关您将要接收的数据长度的数据之前,该协议始终会通知您。这样,您可以确保已收到所需的数据,并且您不应该依赖分隔符。
答案 1 :(得分:0)
可能的快速而肮脏的解决方案:
在程序开始时,为您将收到的最大数据量分配足够大的缓冲区。使用单独的“计数”字段来跟踪当前正在使用的数据量。
(我真的不喜欢这个解决方案;我会使用文件或者在块中找到一些处理数据的方法,但它可能适合你。)