节约内存IList< T>实现

本文关键字:实现 IList 内存 | 更新日期: 2023-09-27 17:51:16

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

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

所以我需要一个集合

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

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

MemoryStreamList<T>没有什么不同,但是我不喜欢使用文件作为缓冲区。


所以…你推荐什么收集或方法?

节约内存IList< T>实现

看来您正在为网络应用程序使用不合适的体系结构。你应该只缓冲那些需要的数据。在这里,您使用列表来缓冲数据,直到接收到所需的数据量。

我建议您在每次接收数据时检查数据本身是否存在分隔符,如果存在,则应该只放入数据,直到遇到分隔符为止。一旦数据准备好了,您应该从列表中取出它并使用它并从列表中删除。将所有内容加到列表中并不是一个好方法,而且肯定会消耗大量内存。

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

一个可能的快速和肮脏的解决方案:

在程序开始时,分配一个足够大的缓冲区,以容纳您将接收的最大数据量。使用单独的'count'字段来跟踪当前正在使用的数据量。

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